打开C++故障转储不会在调用堆栈中显示正确的行
Opening a C++ crash dump does not show the right line in the call stack
我看到,当我在Visual Studio中打开C++故障转储时,我发现调用堆栈指向 - 它跳转到该函数中的下一帧的行,或者有时跳转到该函数中下一帧的行之后的下一行。为什么?这背后的逻辑是什么?
啪!
基本上不记录呼叫的位置;记录返回的位置。 因此,将显示返回位置。
调用堆栈是从堆栈中提取的。 调用 functiom 时,代码中指令指针在函数完成时将要去的返回位置放置在堆栈上。
调试器/调用堆栈显示软件对堆栈上的数据进行反向工程,以确定此返回的位置。 然后使用 pdb 文件将返回的位置映射到代码行。
一个if
子句的两个分支可能具有调用函数的不同位置,但都以完全相同的指令返回。 确定用于调用函数的两者中的哪一个是不切实际的,而知道函数返回到何处既简单又可靠。 该行通常足以调试问题。
最重要的是,编译器的优化打破了你正在C++逐行运行代码的想法;你实际上是在编写由C++代码生成的代码。 生成的机器代码中的指令可以对应于多个不同C++代码行的部分。
在两者之间,调用堆栈帧指向一条线并不罕见。 有时它离得很远;对于相同的折叠,有时它完全是错误的功能。
相关文章:
- 提升堆栈跟踪不显示函数名称和行号
- WinDbg 不显示某些小型转储文件的完整堆栈跟踪
- 如何使用方法覆盖在输出屏幕上显示堆栈整数值
- 调用堆栈显示 SIGBUS,这意味着什么
- 如何正确显示此堆栈的内容?
- 打开C++故障转储不会在调用堆栈中显示正确的行
- 如何在 c++ 中显示(或循环)堆栈
- 哪些更好的方法可以显示使用C STL创建的堆栈而不弹出每个元素的方法
- 堆栈在函数中弹出仍然显示在主函数中。调用不应该通过引用给定的向量吗
- GDB 显示奇怪的堆栈跟踪
- 我如何修改我的C 程序以显示用户输入的单词,并使用堆栈向后
- 模板堆栈类:堆栈中没有显示数据
- 本地变量的地址不在smaps显示的堆栈地址范围内
- 在C++中显示堆栈元素时的无限循环
- Visual Studio 2008 在堆栈溢出后显示完整的堆栈跟踪
- 可视化泄漏检测器(VLD)显示空的调用堆栈
- 堆芯转储的原因是什么?来自oraclelib的堆栈显示
- gdb回溯没有显示main()的完整堆栈跟踪
- 无法显示堆栈或推送
- c++程序成功构建,没有输出,只显示堆栈跟踪