作为一个刚刚开始学习计算机调试复杂性的人,在我的生活中,我无法理解如何在Windbg中读取转储的堆栈文本。我不知道从哪里开始如何解释它们或如何解决它。谁能为这个可怜的灵魂提供方向?
即(实际上我手边唯一的转储)
>b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94 b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255 b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0 b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000
我知道问题与Nvidia显示驱动程序有关,但我想知道的是如何实际读取堆栈(例如,什么是b69dd8f4?): - [
答案 0 :(得分:18)
首先,您需要配置正确的符号。符号将允许您将内存地址与函数名称匹配。为此,您必须在计算机中创建一个本地文件夹,您将在其中存储符号的本地缓存(例如:C:\ symbols)。然后,您需要指定符号服务器路径。要执行此操作,请转到:文件>符号文件路径和类型:
SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
您可以找到有关如何正确配置符号here。
的更多信息正确配置符号服务器后,您可以从以下位置打开minidump:文件>打开崩溃转储。
一旦minidump打开,它将在命令行的左侧显示生成转储时正在执行的线程。如果你想看看这个线程正在执行什么类型:
kpn 200
首次执行它可能需要一些时间,因为它必须首次下载必要的公共Microsoft相关符号。下载完所有符号后,您将获得如下内容:
01 MODULE!CLASS.FUNCTIONNAME1(...)
02 MODULE!CLASS.FUNCTIONNAME2(...)
03 MODULE!CLASS.FUNCTIONNAME3(...)
04 MODULE!CLASS.FUNCTIONNAME4(...)
其中:
您可能还会看到类似
的内容01 MODULE!+989823
这表示您没有此DLL的正确符号,因此您只能看到方法偏移。
那么,什么是callstack?
想象一下,你有这段代码:
void main()
{
method1();
}
void method1()
{
method2();
}
int method2()
{
return 20/0;
}
在这个代码中,方法2基本上会抛出异常,因为我们试图除以0,这将导致进程崩溃。如果我们在发生这种情况时得到一个minidump,我们会看到以下callstack:
01 MYDLL!method2()
02 MYDLL!method1()
03 MYDLL!main()
你可以从这个调用堆中跟随“main”调用“method1”然后调用“method2”并且失败。
在你的情况下,你有这个callstack(我猜是运行“kb”命令的结果)
b69dd8f0 bfa1e255 016d2fc0 89efc000 00000040 nv4_disp+0x48b94
b69dd8f4 016d2fc0 89efc000 00000040 00000006 nv4_disp+0x49255
b69dd8f8 89efc000 00000040 00000006 bfa1dcc0 0x16d2fc0
b69dd8fc 00000000 00000006 bfa1dcc0 e1e71018 0x89efc000
第一列表示子帧指针,第二列表示正在执行的方法的返回地址,接下来的三列显示传递给方法的前3个参数,最后一部分是DLL名称(nv4_disp)和正在执行的方法的偏移量(+ 0x48b94)。由于您没有符号,因此无法看到方法名称。我怀疑NVIDIA是否可以公开访问他们的符号,所以我猜你不能从这里获得太多信息。
我建议你运行“kpn 200”。这将显示完整的callstack,您可能会看到导致此崩溃的方法的来源(如果它是Microsoft DLL,您应该在我提供的步骤中使用正确的符号)。
至少你知道它与NVIDIA错误有关;-)尝试将此驱动程序的DLL升级到最新版本。
如果您想了解有关WinDBG调试的更多信息,我建议您使用以下链接:
答案 1 :(得分:3)
这里有一个关于解释堆栈跟踪的非常好的教程:
http://www.codeproject.com/KB/debug/cdbntsd2.aspx
然而,即使有这样的教程,在没有适当的符号可用/加载的情况下解释堆栈转储也是非常困难的(或几乎不可能)。
答案 2 :(得分:2)
http://support.microsoft.com/kb/315263
和
http://www.networkworld.com/news/2005/041105-windows-crash.html
答案 3 :(得分:0)
包含您尝试阅读的堆栈示例可能会有所帮助。一个好的建议是确保堆栈中显示的所有模块都有正确的调试符号。这包括操作系统中模块的符号,Microsoft已将其符号服务器公之于众。