В основном местоположение звонка не записывается;местоположение return записывается.Таким образом, отображается место возврата.
Стек вызовов извлекается из стека.Когда вы вызываете функцию, в стеке помещается место возврата в вашем коде, куда будет направлен указатель инструкции после завершения функции.
Программное обеспечение для отображения отладчика / стека вызовов выполняет обратный инжиниринг данных в стекевыяснить, где будет это возвращение.Затем файлы pdb используются для сопоставления места возврата с строками кода.
Две ветви одного предложения if
могут иметь разные места, где вы вызываете функцию, но обе возвращаются с одной и той же инструкцией.Определение того, какой из этих двух объектов используется для вызова функции, нецелесообразно, а знать, куда возвращается функция, легко и надежно.И этой строки обычно достаточно для отладки проблемы.
Кроме того, оптимизация компилятором ломает идею, что вы запускаете код C ++ построчно;вы на самом деле пишете код, сгенерированный кодом C ++.Инструкция в сгенерированном машинном коде может соответствовать частям множества различных строк кода C ++.
Между ними наличие фреймов стека вызовов, указывающих на строку, не редкость.Иногда это очень далеко;и при одинаковом сворачивании comdat иногда это совершенно неправильная функция.