Открытие аварийного дампа C ++ не показывает правильную строку в стеке вызовов - PullRequest
0 голосов
/ 24 мая 2018

Я вижу, что когда я открываю аварийный дамп C ++ в Visual Studio, я обнаруживаю, что стек вызовов указывает - либо на строку, с которой он перешел на следующий кадр в этой функции, либо иногда на следующую строку после строка, с которой он перешел к следующему кадру в этой функции.Это почему?Какая логика стоит за этим?

TIA!

1 Ответ

0 голосов
/ 24 мая 2018

В основном местоположение звонка не записывается;местоположение return записывается.Таким образом, отображается место возврата.

Стек вызовов извлекается из стека.Когда вы вызываете функцию, в стеке помещается место возврата в вашем коде, куда будет направлен указатель инструкции после завершения функции.

Программное обеспечение для отображения отладчика / стека вызовов выполняет обратный инжиниринг данных в стекевыяснить, где будет это возвращение.Затем файлы pdb используются для сопоставления места возврата с строками кода.

Две ветви одного предложения if могут иметь разные места, где вы вызываете функцию, но обе возвращаются с одной и той же инструкцией.Определение того, какой из этих двух объектов используется для вызова функции, нецелесообразно, а знать, куда возвращается функция, легко и надежно.И этой строки обычно достаточно для отладки проблемы.

Кроме того, оптимизация компилятором ломает идею, что вы запускаете код C ++ построчно;вы на самом деле пишете код, сгенерированный кодом C ++.Инструкция в сгенерированном машинном коде может соответствовать частям множества различных строк кода C ++.

Между ними наличие фреймов стека вызовов, указывающих на строку, не редкость.Иногда это очень далеко;и при одинаковом сворачивании comdat иногда это совершенно неправильная функция.

...