问题标签 [dbghelp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
216 浏览

dbghelp - SymGetSymFromAddr32 中的死锁

我在我的可执行文件的测试版本中调用 SymGetSymFromAddr32。直到最近这才正常工作,但是当使用 Windows SDK 8.1 中的 dbghelp.dll 和 symsrv.dll 时,我的应用程序在调用此函数时挂起。

这是我得到的调用堆栈:

这是在使用 Windows SDK 8.1 中的 DLL 时(试用版本 6.3.9600.17200 和 6.3.9600.17298)。

当我从 Windows SDK 8.0(版本 6.2.9200.20512)切换回 DLL 时,应用程序可以正常工作并且不再挂起。

注意:为了确保我使用的是正确的 dbghelp.dll(支持符号服务器的那个,而不是 Windows 中默认安装的那个),我使用 LoadLibrary 显式加载 dbghelp.dll,并且 symsrv.dll 存储在同一个文件夹中.

有什么建议么?

0 投票
1 回答
403 浏览

dbghelp - dbghelp 版本?

我一直在对 Dbghelp 进行一些研究,试图确定我是否需要经历更新它的麻烦。我目前使用的是 6.12 版本,有人有 6.12 到 6.13.X 的更改日志吗?或者如果没有,你知道是否有任何重要的改变吗?

0 投票
1 回答
230 浏览

c++ - DbgHelp 函数的同步要求

我最近实现了一个实用程序来使用MiniDumpWriteDump调试帮助库的一部分)编写用户模式转储。实现被分离成它自己的进程。目标进程可以启动此实用程序并与其通信以触发写入小型转储。

这一切都按预期工作。不过,我不确定如何解释MiniDumpWriteDump的并发规则:

所有 DbgHelp 函数,例如这个函数,都是单线程的。因此,从多个线程调用此函数可能会导致意外行为或内存损坏。为避免这种情况,您必须将来自多个线程的所有并发调用同步到该函数。

以上是指不同线程对单个进程的调用吗?或者并发调用是否也需要同步,如果MiniDumpWriteDump在不同的进程中调用(例如,当每个目标进程启动它自己的实用程序进程时)?

0 投票
0 回答
73 浏览

c++ - 试图绕道 IUnknown_AddRef_Proxy & IUnknown_Release_Proxy 没有成功

出于某种原因,我无法获取IUnknown_AddRef_ProxyIUnknown_Release_Proxy使用 的地址DetourFindFunction()或使用SymEnumSymbols(). 我在 中找到了另一个rpcrt4,但已确定其中有一个combase是我正在寻找的那个。

我使用的两个函数可以找到一个 inrpcrt4但不是 in combase,但是,当我到达 comip.h 中调用相应函数的行时,它不会调用一个 inrpcrt4而是调用一个 in combase。此信息必须在某处可用,因为 VS 调试器将其显示在调用堆栈上。我如何获得其中一个的地址combase

0 投票
1 回答
1092 浏览

c++ - DbgHelp - 获取完整的符号签名(函数名 + 参数类型)

我正在使用SymEnumSymbols将所有匹配符号获取到给定掩码,并使用 CALLBACK 函数将它们推送到向量中。问题是,符号名称(在PSYMBOL_INFO结构内部)只是函数的名称,而不是整个签名。例如,我有这个函数:

当我SymEnumSymbols使用 mask调用"TestMe!GetImageProcAddress"并打印匹配符号的名称时,我得到:

但我希望它打印其中之一:

所以我的问题 - 有没有办法获得完整的符号签名(函数名称+参数类型)?我能够使用SymSetContext, 然后SymEnumSymbols使用标志来迭代参数SYMFLAG_PARAMETER- 但我不知道如何获取参数的类型..

谢谢!

0 投票
1 回答
417 浏览

c++ - dbghelp - 按名称获取结构符号

我正在构建一个符号服务,我希望能够打印结构变量及其偏移量。我正在加载所需的 pdb,并试图找到一个适合给定掩码的结构。例如,我想获取有关 struct 的详细信息_RTL_CRITICAL_SECTION

使用windbg时,我使用命令dt MSVCP120!_RTL_CRITICAL_SECTION并获得结构信息(正是我想要的)。但是,当我使用我的代码搜索符号时:

什么都没有打印..意思是,没有匹配的掩码..当掩码是一个函数时,这确实有效(例如"MSVCP120!std::tr2::sys::_Open_dir"

那么,如何获得结构的符号..?

谢谢!

0 投票
0 回答
138 浏览

pinvoke - Get ModuleNeme from ProcessThread.StartAddress

ProcessThread.StartAddress is the memory address of the function that the operating system called that started this thread.

How I get the function name and Module name?

for get function name I found SymFromAddr but for Module name I need help.

0 投票
1 回答
404 浏览

c# - 使用 MiniDump (DbgHelp.h) 获取句柄数据

我正在努力通过 Minidump (DbgHelp.h) 获取句柄信息。

MINIDUMP_HANDLE_DESCRIPTOR_2从映射文件流中获取列表。然后我MINIDUMP_HANDLE_OBJECT_INFORMATION通过使用该ObjectInfoRva字段为每个描述符获取 a 。

但是我无法理解这个MINIDUMP_HANDLE_OBJECT_INFORMATION结构给了我什么信息,我在网上找不到任何从 中提取有意义信息的示例MINIDUMP_HANDLE_OBJECT_INFORMATION,而且文档也不是很有帮助。

如何使用MINIDUMP_HANDLE_OBJECT_INFORMATION结构数据来获取人类可读的数据?我的意思是我需要用它做什么?我总是在InfoType提交时得到 0,这意味着 - MiniHandleObjectInformationNone

MINIDUMP_HANDLE_OBJECT_INFORMATION 结构:

我用 MINIDUMP_HANDLE_OBJECT_INFORMATION 结构做了一些实验

当我得到结构时,我能够从 RVA 地址中读取一个大小为SizeOfInfo大小的字符串。在这里,我将'Directory'作为字符串获取到我得到的所有句柄描述符上......

文档链接:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms680375(v=vs.85).aspx

任何帮助将不胜感激 :)

我试图应用它的过程使用WaitForMultipleObjectsWaitForSingleObject Kernel32调用。

链接到我的实现:

https://github.com/Pavel-Durov/Multithreading-Debugging-Asignments/blob/master/Assignments/Assignments.Core/Handlers/MiniDumpHandler.cs

链接到我在同一个转储文件上执行的 WinDbg命令输出: https ://docs.google.com/document/d/1Hjid-2dcM0aZrg5A1p5VrCBSysU_VQhynXdBAvXV29Q/edit?usp=sharing!handle

也许问题是我没有为我的 MINIDUMP_HANDLE_OBJECT_INFORMATION_TYPE 枚举设置有效值,有没有人熟悉这个枚举值声明的可靠来源?我没有找到任何官方的东西。

只是为了说清楚。

在 WinDbj 中,我获得的信息与从 MINIDUMP_HANDLE_DESCRIPTOR_2 获得的信息相同,例如,如果 WinDbg !handle 命令具有以下输出:

我可以从类型的MINIDUMP_HANDLE_DESCRIPTOR_2ObjectName 和 TypeName 中获取相同的数据MINIDUMP_STRING

无法获得的信息是位于MINIDUMP_HANDLE_OBJECT_INFORMATION结构中的信息。!hanlde这在命令输出中不可见。

什么样的信息应该位于 MINIDUMP_HANDLE_OBJECT_INFORMATION 中?

0 投票
2 回答
1285 浏览

debugging - 如何使用 MiniDumpWriteDump 获得有意义的堆栈跟踪

我正在尝试以编程方式生成堆栈跟踪。当我的用户发生崩溃时,尤其是随机崩溃时,很难通过获取转储的过程与他们交谈,以便我可以解决问题。过去,一旦他们向我发送跟踪信息,我会将其中的地址交叉引用到 Intermediate/foo.map 文件,以找出问题所在(这是最好的方法吗?)

我根据在网上找到的各种示例构建了一个库,以输出一个小型转储以使我的工作更轻松。我上演了一次崩溃,但是我从 minidump 文件获得的堆栈跟踪与我从附加 windbg 获得的实时堆栈跟踪大不相同。两者的例子如下:

迷你转储.dmp:

WinDbg.exe:

game.exe 不是我的,我没有源代码/符号。Main.dll 被注入到 game.exe 中,它提供前端功能以从游戏中加载其他 DLL。调试代码和分阶段崩溃位于 Minidump.dll 中。Main.dll 加载 Minidump 后,它调用 AfterLoad(),它设置异常过滤器,然后触发崩溃。相关的小型转储代码如下:

当我打开 MiniDump.dmp 时,我将它指向我的所有符号文件(game.exe 除外,我没有它),那部分似乎正在工作。我确实将它指向 game.exe 二进制文件,因为我有它。我从中得到的堆栈跟踪真的没有帮助。我的最终目标是用户可以加载 DLL,导致崩溃,然后通过电子邮件将转储文件发送给我。然后我将附加符号文件和二进制文件,并能够为它们诊断问题。我做错了什么,还是无法得到我想要的。

我试图从所有细节中删除一些脂肪以简化问题,但如果需要我可以更明确。我在 CodeProject 上找到了很好的文章,我尝试查找更多背景信息来阅读以帮助我理解问题,但我能找到的并没有帮助我理解它们只是一步一步地得到它正在运行(已经是)。任何人都知道我做错了什么,或者可能指向相关阅读?


在 Sergei 的建议之后,我在 windbg 中做了 .ecxr 并获得了更好的输出,但是当我将 windbg 直接挂接到进程并触发崩溃时,它仍然与我得到的跟踪不匹配。这是小型转储跟踪;

以及将调试器附加到进程的跟踪

我没有game.exe的源代码(我有错误所在的DLL),但我反编译了game.exe,这是game+0x359035的内容。

我触发的错误在 Minidump.dll 中,但堆栈顶部的这段代码在 game.exe 中。game.exe 内部可能发生了很多我不知道的事情,它可能会劫持我以某种方式触发的错误吗?IE,我在 DLL 中触发了错误,但是 game.exe 中的某些设置在调用写入 minidump 的异常过滤器之前捕获了程序流?

如果是这种情况,当我将调试器附加到进程时,触发错误并获得指向错误在我的 DLL 中的正确输出,那么这意味着 game.exe 在调试器可以执行之前没有捕获程序流痕迹。我怎样才能使我的小型转储代码的行为方式相同......这进入了我不太熟悉的领域。有任何想法吗?


我追得更远,调用该函数的函数中有这一行:

所以,我认为在我的代码尝试获取转储之前,game.exe 正在劫持异常以进行自己的转储。然后我的转储跟踪只是game.exe转储过程的跟踪......


回答

我已经弄清楚了。我不知道如何回答我自己的帖子,所以这是交易。

那来自game.exe。事实证明,game.exe 是自己的小型转储。我的小型转储是在他们之后触发的,所以我在堆栈跟踪中看到的是他们的转储过程的踪迹。我在游戏的安装目录中找到了一个 dmp 文件,一旦我将符号加载到其中,它就会显示我所追求的正确输出。

0 投票
1 回答
451 浏览

visual-c++ - 我可以静态链接到 dbghelp。许可后果是什么?

我需要将 dbghelp.lib 静态链接到我的 VS C++ 应用程序,以便从客户机器获取崩溃转储。我们有一个完全荒谬的要求,即应用程序必须是一个无需安装的可执行文件。这就是我不动态链接到 dbghelp.dll 的原因,因为那将是另一个要包含的文件。

我可以合法地这样做吗?我是否在某处与某些神秘的 EULA 发生冲突?