打开C ++故障转储不会在调用堆栈中显示正确的行

时间:2018-05-24 05:52:36

标签: c++ windows visual-studio visual-c++-2012

我看到当我在Visual Studio中打开C ++崩溃转储时,我发现调用堆栈指向 - 它跳转到该函数中下一帧的行,或者有时是下一行 它跳转到该函数中下一帧的行。这是为什么?这背后的逻辑是什么?

TIA!

1 个答案:

答案 0 :(得分:3)

基本上没有记录通话的位置;记录 return 的位置。因此显示返回位置。

从堆栈中提取调用堆栈。当你调用一个函数时,代码中返回的位置会在函数完成时将指令指针放在堆栈中。

调试器/调用堆栈显示软件反向设计堆栈上的数据,以确定返回的位置。然后pdb文件用于映射返回代码行的位置。

一个if子句的两个分支在调用函数时可能有不同的位置,但两者都返回完全相同的指令。确定用于调用函数的两个中的哪一个是不切实际的,同时知道函数返回的位置是容易和可靠的。这条线通常足以调试问题。

最重要的是,编译器的优化打破了你逐行运行C ++代码的想法;你实际上在编写由C ++代码生成的代码。生成的机器代码中的指令可以对应于多个不同C ++代码行的部分。

在两者之间,让调用堆栈帧指向一条线并不罕见。有时它非常遥远;并且使用相同的comdat折叠有时它完全是错误的功能。