【问题标题】:Can't figure out what's wrong in my code无法弄清楚我的代码有什么问题
【发布时间】:2025-11-28 09:55:02
【问题描述】:

我有一个我设法从我的 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 符号更新了调用堆栈,但我仍然不知道这可能来自哪里。

【问题讨论】:

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

标签: c++ debugging memory-dump


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的,完成了,但它仍然纯粹在 Microsoft DLL 中,所以我不知道为什么会引发异常。显然这是一个内存访问,但不知道为什么。
  • 那么调用堆栈上的下一个未知数是什么?为此加载符号。如果它是您的可执行文件,则将符号路径添加到包含该版本的可执行文件和该版本的 pdb 文件的文件夹。然后让它在调用堆栈上加载该行的符号。
  • 就是这样,调用堆栈上没有我的应用程序。 // 好吧,原来是相机的 API 导致了错误。感谢 Microsoft 符号库的提示!令人困惑的是它说我的 DLL 是原因,但 DLL 根本没有使用相机 API...