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

Opening a C++ crash dump does not show the right line in the call stack

本文关键字:显示 堆栈 调用 故障 C++ 转储 打开      更新时间:2023-10-16

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

啪!

基本上不记录呼叫的位置;记录返回的位置。 因此,将显示返回位置。

调用堆栈是从堆栈中提取的。 调用 functiom 时,代码中指令指针在函数完成时将要去的返回位置放置在堆栈上。

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

一个if子句的两个分支可能具有调用函数的不同位置,但都以完全相同的指令返回。 确定用于调用函数的两者中的哪一个是不切实际的,而知道函数返回到何处既简单又可靠。 该行通常足以调试问题。

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

在两者之间,调用堆栈帧指向一条线并不罕见。 有时它离得很远;对于相同的折叠,有时它完全是错误的功能。