我看到,当我在 Visual Studio 中打开 C++ 崩溃转储时,我发现调用堆栈指向 - 它跳转到该函数中下一帧的行,或者有时是 之后的下一行 在该函数中跳转到下一帧的行。这是为什么?这背后的逻辑是什么?
TIA!
最佳答案
基本上没有记录通话地点; 返回的位置被记录下来。所以显示返回位置。
从栈中提取调用栈。当您调用函数时,代码中的返回位置(函数完成时指令指针将到达的位置)被放置在堆栈中。
调试器/调用堆栈显示软件对堆栈上的数据进行逆向工程,以确定返回的位置。然后使用pdb文件将return的位置映射到代码行。
一个 if
子句的两个分支可以有不同的调用函数的位置,但都以完全相同的指令返回。确定两个 where 中的哪一个用于调用函数是不切实际的,而知道函数返回到哪里是简单且可靠的。该行通常包含足够的信息来调试问题。
最重要的是,编译器的优化打破了你正在逐行运行 C++ 代码的想法;您实际上是在编写由 C++ 代码生成的代码。生成的机器码中的一条指令可能对应多个不同C++代码行的部分。
在这两者之间,调用堆栈帧指向一条线的情况并不少见。有时它非常遥远;并且使用相同的 comdat 折叠有时完全是错误的功能。
关于c++ - 打开 C++ 崩溃转储不会在调用堆栈中显示正确的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50501895/