2012-12-20 54 views
-1

我有一个转储文件,我设法从我的DLL中为任何未处理的异常创建。无法弄清楚我的代码有什么问题

当我做了类似int* tt = new int[4]; return int[n];的事情,n = 4时,我会得到转储文件,并可以打开它,并查看导致错误的行。这对于发布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次(有时在第1次尝试,有时在第5次)。我完全迷失在这里发生的事情上。

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

+0

什么是'return int [n];'? – NPE

+0

这只是一种证明我的内存转储功能正在工作的方式。如果我用return int [4]调用它;我会得到一个访问错误,这与我现在正在获取的错误是一样的,但我不知道访问错误可能发生的位置。 – SinisterMJ

回答

2

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

想必您使用的是视觉工作室? 将其设置为访问来自Microsoft符号服务器的符号:http://msdn.microsoft.com/en-us/library/b8ttk8zy(v=vs.80).aspx

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

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

+0

好的,完成了,但它仍然纯粹在Microsoft DLL中,所以我不知道为什么会引发异常。这显然是内存访问,但不知道为什么。 – SinisterMJ

+0

那么接下来在callstack上未知的是什么? 加载符号。 如果它是您的可执行文件,则将符号路径添加到包含该版本可执行文件和该版本的pdb文件的文件夹。然后让它加载callstack上该行的符号。 – Pete

+0

那就是说,我的应用程序在这个调用堆栈上没有任何内容。 //好吧,原来相机的API导致了错误。感谢您使用Microsoft Symbol基础的提示!令人困惑的是,它说我的DLL是原因,但该DLL根本没有使用Camera API ... – SinisterMJ

相关问题