我有一个转储文件,我设法从我的 DLL 创建了一个转储文件,该文件是为任何未处理的异常创建的。
当我做了类似 int* tt = new int[4]; 的事情时return int[n];
当 n = 4 时,我会得到转储文件,然后打开它,看看在哪一行引起了错误。这对于直接从发布 exe 和发布 DLL 都是可能的。
现在这是一个简单的错误,我输入它只是为了测试我的内存转储创建。
我现在有一个 900kb 的转储文件,事件日志显示错误来 self 的 .DLL,但如果我打开该文件,它不会显示任何源代码。
调用栈是
KERNELBASE.dll!RaiseException() + 0x3d bytes
clr.dll!RaiseTheExceptionInternalOnly() + 0x18f bytes
clr.dll!IL_Throw() + 0xe2 bytes
000007fe81f65fd7()
00000000034d1610()
000000002d06ecb8()
436f93ce00050011()
436f93cf00110012()
000000002d06ec50()
00006d930c4f7680()
clr.dll!InlinedCallFrame::`vftable'()
000000002d06f3d8()
这根本无法帮助我找出我的错误来自 DLL 中的何处。 调试的另一个问题是,它只发生在实时 PC 上,但从来没有发生在我的调试系统上。谁能帮我找到调试方法?它似乎是在调用 DLL 时发生的,但是:不是每次都发生,只是像每 2 次一样(有时是第一次尝试,有时是第 5 次)。我完全不知道这里发生了什么。
编辑: 使用加载的 Microsoft 符号更新了调用堆栈,但我仍然不知道这可能来自何处。
最佳答案
您需要加载 kernelbase.dll 的符号。可能还有 clr.dll。
想必您正在使用 visual studio? 将其设置为从 Microsoft 符号服务器访问符号:http://msdn.microsoft.com/en-us/library/b8ttk8zy(v=vs.80).aspx
您可能需要右键单击调用堆栈中的项目并告诉它加载符号。
此外,请确保为您制作的任何软件版本保留一份 pdb 文件的拷贝。
关于c++ - 无法弄清楚我的代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13972763/