我看到当我在Visual Studio中打开C ++崩溃转储时,我发现调用堆栈指向 - 它跳转到该函数中下一帧的行,或者有时是下一行 它跳转到该函数中下一帧的行。这是为什么?这背后的逻辑是什么?
TIA!
答案 0 :(得分:3)
基本上没有记录通话的位置;记录 return 的位置。因此显示返回位置。
从堆栈中提取调用堆栈。当你调用一个函数时,代码中返回的位置会在函数完成时将指令指针放在堆栈中。
调试器/调用堆栈显示软件反向设计堆栈上的数据,以确定返回的位置。然后pdb文件用于映射返回代码行的位置。
一个if
子句的两个分支在调用函数时可能有不同的位置,但两者都返回完全相同的指令。确定用于调用函数的两个中的哪一个是不切实际的,同时知道函数返回的位置是容易和可靠的。这条线通常足以调试问题。
最重要的是,编译器的优化打破了你逐行运行C ++代码的想法;你实际上在编写由C ++代码生成的代码。生成的机器代码中的指令可以对应于多个不同C ++代码行的部分。
在两者之间,让调用堆栈帧指向一条线并不罕见。有时它非常遥远;并且使用相同的comdat折叠有时它完全是错误的功能。