问题标签 [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 投票
3 回答
4415 浏览

c - 如何使用 SymLoadModuleEx 加载 PDB 文件?

我正在尝试调用SymLoadModuleEx以从 PDB 文件中加载符号,然后用于SymFromAddr从该 PDB 中查找符号。但是,我不知道要为参数传递什么,BaseOfDll并且DllSize文档明确指出,在加载 PDB 文件时,这些参数不能为 0,并且确实尝试传递 0 会导致它失败,并显示ERROR_INVALID_PARAMETER.

这是我的代码的样子:

加载 PDB 文件时如何确定要传入的内容BaseOfDll和内容?DllSize有问题的 PDB 文件是不同程序可执行文件(不是 DLL)的符号文件,只是为了论证,假设您无权访问生成 PDB 的原始 EXE。

或者,是否有更好的方法从 PDB 文件中查找与给定地址对应的符号?

0 投票
1 回答
1020 浏览

c++ - 如何使用 dbghelp!StackWalk64 遍历混合模式(托管+本机)堆栈?

我正在尝试使用 StackWalk64 在 x64 进程上遍历包含托管帧和本机帧的调用堆栈。一切正常,直到第一个或第二个托管帧,之后 StackWalk64 无法确定帧的返回地址并失败。

我将 SymFunctionTableAccess64 用于函数表访问回调,并且符号处理程序已使用 SymInitialize() 进行了初始化。我需要在 dbghelp 中做些什么来让它正确地遍历托管帧吗?

失败的调用堆栈示例:

UnmanagedFrame1
UnmanagedFrame2
UnmanagedFrame3
ManagedFrame1 <----- (StackWalk64 fails after this frame)
ManagedFrame2
UnmanagedFrame4
UnmanagedFrame5
ntdll!RtlUserThreadStart

注意:这个问题不是关于如何将托管帧解析为符号/方法名称/等,我只是想走完整的堆栈而不考虑符号解析/等。

此外,IDebugControl4::GetContextStackTrace 工作正常,但 DbgEng 使用自定义函数表回调,而不是简单地委托给 SymFunctionTableAccess64。我怀疑问题在于 CLR 使用 RtlInstallFunctionTableCallback 来安装回调函数表(指向 mscordacwks),而 SymFunctionTableAccess64 不够聪明,无法遵循这一点。

我花了一些时间尝试编写自定义函数表访问回调来遍历函数表链并在 mscordacwks 中调用回调,但它变得非常粗略并且无论如何都没有真正起作用。

0 投票
1 回答
367 浏览

c++ - 获取调试符号的模块名称


有没有办法获取在 C++/Windows 中使用 dbgHelp 获得的调试符号的模块名称?
谢谢 :)

0 投票
2 回答
5511 浏览

windows - 如何从小型转储中提取堆栈跟踪?

我有一大堆 minidump,它们是在应用程序运行时通过 MiniDumpWriteDump 记录的。小型转储是在与我的开发机器具有不同操作系统版本的机器上创建的。

现在我正在尝试编写一个程序,使用 dbghelp.dll 从小型转储中提取堆栈跟踪。我正在走 MINIDUMP_MODULE_LIST 并调用 SymLoadModule64,但这无法从公共符号服务器下载 pdb(kernel32 等)。如果我将“C:\Windows\System32”添加到符号路径,它会找到 dll 并下载符号,但它们当然与 minidump 中的 dll 不匹配,因此结果毫无用处。

那么如何告诉 dbghelp.dll 下载并使用正确的 pdb?

[编辑]

我忘了说 SymLoadModule64 只接受一个文件名,没有版本/校验和信息,所以显然单独使用 SymLoadModule64 dbghelp 不可能确定要下载哪个 pdb。

该信息实际上在 MINIDUMP_MODULE_LIST 中可用,但我不知道如何将其传递回 dbghelp API。

有 SymLoadModuleEx 需要额外的参数,但我不知道这是否是我需要的或者我应该为额外的参数传递什么。

[编辑]

到目前为止没有运气,尽管我注意到调试 SDK 中还有 dbgeng.dll 与 dbghelp.dll 一起分发。MSDN 看起来有据可查,并说它与 windbg 使用的引擎相同。也许我可以用它来提取堆栈跟踪。

如果有人可以向我指出一些使用 dbgeng.dll 处理小型转储的介绍,这可能也会有所帮助,因为 MSDN 仅记录了各个组件,但没有记录它们如何协同工作。

0 投票
1 回答
242 浏览

c++ - 我正在寻找一个从 .PDB 文档中处理调试符号的 C++ 库

创建一个模块来解码 PDB 文档中定义的结构;任何人都可以为我提供一个可以从 PDB 文档中提取所需调试符号的模块吗?谢谢。

0 投票
2 回答
1824 浏览

c++ - 使用 DEBUG 标志打开进程的问题

我正在尝试使用CreateProcess带有DEBUG_PROCESSandDEBUG_ONLY_THIS_PROCESS标志的调试器打开一个进程,并且该进程已打开,但是当我尝试SymInitialize使用收到的句柄调用时,它失败了。

这是我的代码:

如果我在没有创建标志的情况下调用 CreateProcess,则 symInitialize 成功。
我究竟做错了什么?

0 投票
2 回答
1346 浏览

c# - 来自 C# 的 SymLoadModule64 和 GetCurrentProcess

我想使用 dbghelp 库从 pdb 文件中获取一些类型和程序信息。现在,因为我更喜欢 C# 而不是 C++,所以我目前正试图让它在 C# 中工作。我目前被困在对 SymLoadModule64 的调用中。我在 C++ 中有一个工作调用,如下所示:

但是,当尝试以某种方式从 C# 调用它时,我不断收到错误消息:

导致loadedModule 设置为0 并且Marshal.GetLastWin32Error() 返回6 (ERROR_INVALID_HANDLE)。现在,我认为这似乎是句柄的问题,我可以只使用本机函数来检索它(以避免由于 c# 句柄检索内容与 c++ 期望的不兼容而导致的任何陷阱等)。然而,虽然托管

总是返回一些或多或少有意义的东西(1008、1036、...),调用

总是返回 -1。

所以:由于我很欣赏关于“主要”问题的任何想法(如何让 SymLoadModule64() 从 C# 工作),我当然也很想知道为什么对 GetCurrentProcess() 的调用失败。提前致谢。

0 投票
1 回答
2338 浏览

debugging - StackWalk64() 返回单帧

当试图获取某个进程的线程的调用堆栈时,我总是得到一个相同的帧,尽管它肯定有更多(至少 5 帧)。

StackWalk64() 总是在第一次调用时成功 - 返回一个帧:

但是,在第二次调用时,它立即失败,错误 id 为 998-ERROR_NOACCESS(可能是这个错误不是因为这个调用,正如 MSDN 所说)。

此外,尝试使用 SymFromAddr() 将此地址解析为其符号名称失败,并出现错误 126-ERROR_MOD_NOT_FOUND(在成功调用 SymInitialize(m_processHandler,NULL,TRUE) 之后)。

这是代码:

会是什么呢?

0 投票
1 回答
6617 浏览

windows - DLL 中未解决的符号错误

作为背景,我遇到了将中型 linux 代码库(编译成巨大的 .so)移植到 x64 窗口(编译成 .dll)。我遇到了链接器问题。

作为一个最小的测试用例,如果我只从以下文件创建一个 Visual Studio 项目:

我将项目类型设置为 DLL 并构建它,我收到错误“LNK2001:未解析的外部符号 __imp_UnDecorateSymbolName”。也就是说,文件可以正确编译,但无法链接到 dll。

我认为目标是让我的 dll 链接到 dbghelp.dll,特别是因为(至少在我的系统上)没有像 dbghelp.lib 这样的文件。那么为什么它现在尝试解析该符号,而不是当我的 DLL 加载到应用程序中时呢?为什么它无论如何都看不到该功能?

需要明确的是,我已经确认我正在构建 x64 DLL,并且 C:\Windows\System32 中的 dbghelp.dll 是 x64。

0 投票
1 回答
140 浏览

clr - 获取 !dumpheap -stat 中未列出的 ValueType 的名称/MT 的有效方法

我正在研究 SOS 命令及其输出,但我注意到似乎没有办法以某种方式获取当前正在使用的所有类型。到目前为止最好的方法是!dumpheap -stat,但它只列出有实例的类型。但是,当 ValueType 从未被装箱时,该类型将不会显示在!dumpheap -stat. (这并不奇怪,因为它们不是在堆上分配的。)

所以我的问题是:是否有任何有效的方法来确定当前存在哪些附加值类型?我的意思是,我可以在检查单个堆对象时按需加载它们(例如!dumpvc <mt> <address>基于!do <address>输出),但是对于显示的统计信息,通过一些比查看(实例/类定义)更简单的方法来查找类型会更好已知的类来确定它们是否使用任何额外的 ValueType。