0

我有一个我设法从我的 DLL 创建的转储文件,该文件是为任何未处理的异常创建的。

当我用 n = 4 做类似的事情int* tt = new int[4]; return int[n];时,我会得到转储文件,并可以打开它,看看错误是在哪一行引起的。这对于直接从发布 exe 和发布 DLL 都是可能的。

现在这是一个简单的错误,我输入它只是为了测试我的内存转储创建。

我现在有一个 900kb 的转储文件,事件日志显示错误来自我的 .DLL,但如果我打开该文件,它不会显示任何源代码。

调用堆栈是

KERNELBASE.dll!的RaiseException()+ 0x3D之间字节
clr.dll!RaiseTheExceptionInternalOnly()+ 0x18f字节
clr.dll!IL_Throw()+ 0xe2字节
000007fe81f65fd7()
00000000034d1610()
000000002d06ecb8()
436f93ce00050011()
436f93cf00110012()
000000002d06ec50()
00006d930c4f7680( )
clr.dll!InlinedCallFrame::`vftable'()
000000002d06f3d8()

这根本无法帮助我弄清楚我的错误来自 DLL 中的哪个位置。调试的另一个问题是,它只发生在实时 PC 上,但从不在我的调试系统上。谁能帮我找到一种方法来调试它?它似乎发生在调用 DLL 时,但是:不是每次,只是像每 2 次一样(有时是第一次尝试,有时是第 5 次)。我完全迷失了这里发生的事情。

编辑:使用加载的 Microsoft 符号更新了调用堆栈,但我仍然不知道这可能来自哪里。

4

1 回答 1

2

您需要加载 kernelbase.dll 的符号。可能还有 clr.dll。

大概你正在使用视觉工作室?将其设置为从 microsoft 符号服务器访问符号:http: //msdn.microsoft.com/en-us/library/b8ttk8zy (v=vs.80).aspx

您可能需要右键单击调用堆栈中的项目并告诉它加载符号。

此外,请务必为您制作的任何软件版本保留一份 pdb 文件的副本。

于 2012-12-20T13:05:07.640 回答