打开 C++ 崩溃转储不会在调用堆栈中显示正确的行
Opening a C++ crash dump does not show the right line in the call stack
我看到当我在 Visual Studio 中打开 C++ 故障转储时,我发现调用堆栈指向 - 它跳转到该函数中下一帧的行,有时甚至是下一个line after 跳转到该函数中下一帧的行。这是为什么?这背后的逻辑是什么?
TIA!
基本上没有记录通话地点; return的位置被记录下来。所以显示return位置。
从堆栈中提取调用堆栈。当您调用函数时,代码中的 return 位置(函数完成时指令指针将到达的位置)被放置在堆栈上。
debugger/call 堆栈显示软件对堆栈上的数据进行逆向工程,以计算出此 return 的位置。然后使用 pdb 文件将 return 的位置映射到代码行。
一个 if
子句的两个分支可以在不同的地方调用一个函数,但两个 return 都在完全相同的指令中。确定两个 where 中的哪一个用于调用函数是不切实际的,而知道函数 returns 到哪里是简单可靠的。该行通常是足够的信息来调试问题。
最重要的是,编译器的优化打破了你正在逐行运行 C++ 代码的想法;您实际上是在编写由 C++ 代码生成的代码。生成的机器码中的一条指令可能对应多个不同C++代码行的部分。
在这两者之间,调用堆栈帧指向一条线的情况并不少见。有时它非常遥远;并且使用相同的 comdat 折叠有时完全是错误的功能。
我看到当我在 Visual Studio 中打开 C++ 故障转储时,我发现调用堆栈指向 - 它跳转到该函数中下一帧的行,有时甚至是下一个line after 跳转到该函数中下一帧的行。这是为什么?这背后的逻辑是什么?
TIA!
基本上没有记录通话地点; return的位置被记录下来。所以显示return位置。
从堆栈中提取调用堆栈。当您调用函数时,代码中的 return 位置(函数完成时指令指针将到达的位置)被放置在堆栈上。
debugger/call 堆栈显示软件对堆栈上的数据进行逆向工程,以计算出此 return 的位置。然后使用 pdb 文件将 return 的位置映射到代码行。
一个 if
子句的两个分支可以在不同的地方调用一个函数,但两个 return 都在完全相同的指令中。确定两个 where 中的哪一个用于调用函数是不切实际的,而知道函数 returns 到哪里是简单可靠的。该行通常是足够的信息来调试问题。
最重要的是,编译器的优化打破了你正在逐行运行 C++ 代码的想法;您实际上是在编写由 C++ 代码生成的代码。生成的机器码中的一条指令可能对应多个不同C++代码行的部分。
在这两者之间,调用堆栈帧指向一条线的情况并不少见。有时它非常遥远;并且使用相同的 comdat 折叠有时完全是错误的功能。