我在visual studio

时间:2016-08-12 19:00:19

标签: c++ visual-studio-2010 callstack

我看到这些十六进制字符串似乎不属于visual studio调用堆栈中的任何dll:

000000001665b7e0()
0000000000000935()
0000094500000001()
000000001665b9a4()

通常我会看到类似的东西:

libabc.dll!myclass:myfunction() Line76

它们意味着什么?我如何理解它们?

1 个答案:

答案 0 :(得分:3)

这些确实是函数,但没有人留下“面包屑”,调试器可以使用它来将这些地址转换为函数名。

在这种情况下,000000001665b7e0和函数名之间的映射可以是您没有的符号文件,调试器不知道的符号文件,调试器无法读取的符号文件,或者这样的映射不存在。

你能做些什么?

找到此功能的符号信息并将开发系统指向该功能,或忽略您没有此信息。

前者很棘手,因为你不知道这个功能是什么。您可能必须使用鸟枪方法,添加所有库,但如果您知道程序使用哪些库,则可以缩小搜索范围。

后者是一个可行的选择,因为如果你无法访问调试信息,那么你可能无法对编写代码的人所造成的任何错误做任何事情。也许你可以给他们写一个讨厌的电子邮件。对于已建立的库,更可能是库中没有错误,并且您的程序错误地使用了库。检查库文档并首先调试代码。如果您已经消除了最终错误的可能性,那么请开始深入研究第三方代码。通过已建立的库,通常有一个核心开发人员能够帮助确认和解决库错误。

为什么会这样:

计算机并不关心人们所说的东西。计算机只关心内存中的内容,因此为了使最小的输出文件成为可能,开发系统(AKA“IDE”,“编译器”和“工具链”具有不同程度的准确性)构建工具通常会删除所有运行程序不必要的东西。这些优秀的,易于理解的名字理智的程序员提供了函数,变量,类,以及您将要做的第一件事。

开发系统通常允许您保留此地址符号映射以使调试更容易。正如您所见,原始十六进制数字没有多大用处,没有某种方法将它们映射到可识别的术语,您可以使用它来查找文档。根据构建系统,此信息可能会保留在可执行文件或库中(从而产生更大的输出文件),或者它可能作为可选的符号信息文件出现在旁边。这些映射文件通常特定于开发系统,并且其他开发系统无法读取。