Зачем отладчику нужны символы для восстановления стека? - PullRequest
2 голосов
/ 15 сентября 2010

При отладке в Visual Studio, если символы для стека вызовов отсутствуют, например:

00 > HelloWorld.exe!my_function(int y=42)  Line 291
01   dynlib2.dll!10011435()  
  [Frames below may be incorrect and/or missing, no symbols loaded for dynlib2.dll] 
02   dynlib2.dll!10011497()  
03   HelloWorld.exe!wmain(int __formal=1, int __formal=1)  Line 297 + 0xd bytes
04   HelloWorld.exe!__tmainCRTStartup()  Line 594 + 0x19 bytes
05   HelloWorld.exe!wmainCRTStartup()  Line 414
06   kernel32.dll!_BaseProcessStart@4()  + 0x23 bytes 

, отладчик отобразит предупреждение Frames below may be incorrect and/or missing.

(обратите внимание, что толькоСтроки 01 и 02 не имеют символов. Строка 00, где я устанавливаю точку останова, а все остальные строки имеют загруженные символы.)

Теперь я знаю, как исправить предупреждение (-> получить файл pdb), что яне совсем понимаю, почему это все-таки отображается!Стек, который я вставил выше, полностью в порядке, просто у меня нет файла pdb для модуля dynlib2.dll.

Зачем отладчику нужен файл символов, чтобы убедиться, что стек правильный?

Ответы [ 3 ]

4 голосов
/ 15 сентября 2010

Я думаю, это потому, что не все функции соответствуют «стандартной» компоновке стека.Обычно каждая функция начинается с:

push        ebp  
mov         ebp,esp 

и заканчивается на

pop         ebp  
ret

. При этом каждая функция создает свой так называемый стек стека.EBP всегда указывает на начало кадра верхнего стека.В каждом кадре первые два значения являются указателем на предыдущий кадр стека и адресом возврата функции.

Используя эту информацию, можно легко восстановить стек.Однако:

  1. Эта информация о стеке не будет включать имена функций и информацию о параметрах.
  2. Не все функции подчиняются этой структуре кадра стека.Если включена некоторая оптимизация (например, / Oy, пропустить указатели фреймов стека) - макет стека будет другим.
1 голос
/ 14 сентября 2013

Я пытался понять это сам некоторое время назад.

С 2013 года FPO не используется в MSFT и, как правило, осуждается.Я сталкивался с другой бинарной технологией MS, используемой внутри, которая, вероятно, препятствует простому обходу цепочки EBP: Basic Block Tools .

Как отмечалось в посте, PDB включают в себя «StackFrameTypeEnum», а в другом месте намекнули, что они включают «программу размотки» для стекового фрейма.Так что, в общем, они все еще нужны, и мрачные подробности того, почему именно - не документированы.

0 голосов
/ 15 сентября 2010

Символы отделены от связанного двоичного кода, чтобы уменьшить размер двоичных файлов доставки. Проверьте, насколько велики ваши файлы PDB - огромные, особенно по сравнению с соответствующим двоичным файлом (EXE / DLL). Вы не хотели бы, чтобы эти накладные расходы каждый раз отправлялись, устанавливались и использовались. Это особенно важно во время загрузки. В конце концов, символьная информация предназначена только для отладки, а не для правильной работы вашего кода. При условии, что вы сохраняете символы, соответствующие вашим поставляемым двоичным файлам, вы все равно можете отлаживать проблемы после вскрытия со всеми загруженными символами.

...