c++ - 打开 C++ 崩溃转储不会在调用堆栈中显示正确的行

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

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

TIA!

最佳答案

基本上没有记录通话地点; 返回的位置被记录下来。所以显示返回位置。

从栈中提取调用栈。当您调用函数时,代码中的返回位置(函数完成时指令指针将到达的位置)被放置在堆栈中。

调试器/调用堆栈显示软件对堆栈上的数据进行逆向工程,以确定返回的位置。然后使用pdb文件将return的位置映射到代码行。

一个 if 子句的两个分支可以有不同的调用函数的位置,但都以完全相同的指令返回。确定两个 where 中的哪一个用于调用函数是不切实际的,而知道函数返回到哪里是简单且可靠的。该行通常包含足够的信息来调试问题。

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

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

关于c++ - 打开 C++ 崩溃转储不会在调用堆栈中显示正确的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50501895/

相关文章:

c++ - 如何声明数组成员变量的getter/setter方法

c++ - 我在使用公式时遇到问题,程序运行正常,但答案似乎是错误的

c# - Unity Test Runner 中的单元测试私有(private)方法

windows - 如果在多行替换中死亡,Perl 会报告错误的行号。这是预期的还是错误?

database - 如何中断与数据库的连接以进行测试?

windows - 寻找外部窗口的位置?

c++ - pcap 函数出现未解析的外部符号 (LNK 2001) 错误

c++ - boost::phoenix 用作仿函数时的错误消息

c++ - QNetworkAccessManager 的替代品

c++ - 我应该在这里使用什么样的指针?