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

winapi - 如何让 dbghelp 从自定义符号存储中加载符号?

SymInitialize 和 SymFromAddr 方法有没有办法从自定义符号存储中自动加载符号。我正在尝试使用 SymFromAddr() 将地址解析为可读的函数名称。如果我在本地存储了给定模块的符号,它似乎工作正常,但是我希望它自动从提供给 SymInitialize 的路径下载它们,就像 WinDbg 那样。我这样称呼 SymInitialize :

SymFromAddr 返回错误 487“尝试访问无效地址”。因为它甚至从未尝试下载它,所以找不到该符号。

有什么办法可以强制下载吗?

0 投票
1 回答
377 浏览

c - SymFromAddr 与给定地址的调试器符号不匹配

在我的 Windows 应用程序中,我使用 MinHook ( https://github.com/TsudaKageyu/minhook ) 钩住了 malloc) 我正在使用 CaptureStackBacktrace 和 SymFromAddr 来获取内存泄漏的符号。SymFromAddr 对我的可执行文件中的地址工作可靠,但是当报告来自 DLL 的地址的符号信息时,结果通常不正确。SymFromAddr 不报告错误,它只是返回错误信息。不过,调试器能够获得正确的信息(我可以将鼠标悬停在传递给 SymFrommAddr 的地址上,Visual Studio 会正确报告模块和函数名称)。我认为我的问题可能是错误的符号搜索路径,因此我更新了对 SymInitialize 的调用以包含 MS 符号服务器和可执行文件的路径,但这并没有解决问题。

Visual Studio 调试器是否使用 dbghelp 系统?有没有人知道为什么调试器和 SymFromAddr 不同意?

0 投票
0 回答
205 浏览

c - 符号枚举回调函数多次调用同一个符号?

我编写了一个小程序,它使用 dbghelp 库打印某些可执行文件的所有符号。我调用的主要枚举函数是: SymEnumSymbols 应该接收一个回调,该回调将为每个符号调用。我尝试在 kernel32.dll 上运行该程序,但遇到了 2 个奇怪的问题:

1)有些符号位于同一地址,但它们在 SYMBOL_INFO 结构的所有字段值中都相等(除了唯一索引字段) - 那么我如何区分?(例如:0x6b814c23 -StringCopyWorkerW)

2)在某些情况下,同一地址中有两个具有相同特征的符号。(当我在 IDA 中打开文件时,我看到有两个导出的条目 - 但一个是函数,另一个不是(例如:WerGetFlag 和 WerGetFlagsWorker,它们位于 0x6b84c840)。

谢谢!

这是代码:

0 投票
0 回答
234 浏览

windbg - WinDbg 无法打开转储“Dbghelp 版本不匹配”

这类似于问题WinDbg:尝试附加到进程时 dbghelp.dll 的版本不匹配 但是,我无法发布该问题,并且标记的答案并不是真正的答案,对我不起作用。

我有一台用于调试故障转储的机器,但突然它无法打开任何转储,总是报告

所以它抱怨不匹配,但没有明显的不匹配。

System32 和 SysWOW64 中 dbghelp 和 dbgeng 的版本是 6.1.7601.17514。但请注意:

a) 根据DbgHelp 上的 Microsoft 页面,Windows 和 WinDbg 中的版本不需要(并且可能不应该)同步

b) 我有另一台机器,我安装了 10.0.14321.1024 版本的 WinDbg,并且在 Windows 文件夹中也有 6.1.7601.17514 版本的 dbghelp 和 dbgeng,并且在那台机器上一切正常。

任何帮助表示赞赏。就分析故障转储而言,这台机器基本上是砖头。我已经尝试重新安装windbg,并安装不同的版本,仍然出现同样的错误。

0 投票
1 回答
195 浏览

windows - 是否可以使用 dbghelp.dll 从给定地址获取汇编代码?

我可以通过调用 SymGetLineFromAddr64()dbghelp.dll 使用 dbghelp.dll 在给定地址获取行信息。

它只给我该地址的源代码信息(例如行号和文件名)。但是,在 WinDBG 中,我也可以获得给定地址的汇编代码。我不确定如何使用 dbghelp.dll 来做到这一点。如果不可能,我可以使用任何其他 dll 吗?

0 投票
0 回答
137 浏览

c++ - 加载调试符号而不锁定文件

我正在尝试使用 DbgHelp 为某些模块加载调试符号,而不锁定 PDB 文件,以便我们的客户可以在它们仍由我们加载时删除它们。

我尝试使用FILE_SHARE_DELETE标志创建一个文件,然后SymLoadModule64使用该文件调用,但没有成功:

符号已正确加载,但文件仍处于锁定状态。如果我在调用 EnumerateLoadedModules64 之前停止程序,我可以删除 PDB。

您知道是否可以在不锁定文件的情况下加载符号?

0 投票
1 回答
869 浏览

c++ - 分发 DbgHelp.DLL

我的应用程序依赖于 DBGHELP.DLL 函数,尤其是有关目标进程加载的 DLL 的信息。但是,很多时候它在低于 Vista 的 Windows 版本上失败(你知道 XP 仍然存在!)。环顾四周,发现目标系统上安装/存在的 DBGHELP.DLL 是旧的,并且不支持许多新功能(例如,旧版本不支持MiniDumpWriteDump的几个标志)。

该页面提到了 DbgHelp 版本,并模糊地提到了分发 DBGHELP.DLL(和其他 DLL)。不得提供随 OS 一起提供的 DLL(同意,并且没有任何问题)。然后它说应该提供“Windows 调试工具”中的最新 DLL。

我的问题是:哪个版本可以/应该随应用程序一起提供?选择最新的并假设它可以在最低操作系统(XP)中工作?当然,我不会发布这个 DLL 的调试版本。“ DbgHelp 版本”页面没有提到对特定操作系统的支持性——所以我们可以假设 XP 支持最新版本。

我会将 DLL 放在应用程序目录本身中,并且可以有条件地调用诸如SetDllDirectory之类的函数。如果需要,可以动态加载 DLL 本身和/或 DBGHELP.DLL 的任何函数。

有关的:

0 投票
2 回答
705 浏览

c++ - SymEnumSymbols 返回 ERROR_SUCCESS 但没有给出任何结果

我正在尝试从已加载的 DLL 中枚举符号。对于那些感兴趣的人,这是CPPCoverage 项目的一部分,对于某些功能,我需要符号数据。

问题的分解

当进程启动或加载 DLL 时,需要为一些已计划的新功能枚举符号。

基本上,创建了一个进程,dbghelp用于获取符号信息。接下来,使用 迭代符号SymEnumSymbols。发生这种情况有两个时刻:

  1. 进程启动时 ( CREATE_PROCESS_DEBUG_EVENT)
  2. 加载 DLL 时 ( LOAD_DLL_DEBUG_EVENT)

在 (2) 期间一切正常。但是,在 (1) 期间不能枚举符号。

行为是一切正常,直到SymEnumSymbols调用。返回值告诉我有一个错误,但GetLastError返回成功。此外,不会调用回调函数。

更奇怪的是,调用SymGetSymFromName 确实有效。

最小测试用例

0 投票
0 回答
198 浏览

c++ - SymLoadModuleEx 返回 ERROR_INVALID_ADDRESS

我使用SymLoadModuleEx的是Dbghelp.hVS2015 附带的。该函数只工作一次,并ERROR_INVALID_ADDRESS为下一次调用返回。当我更改调用顺序以便为另一个 DLL(完全不同,甚至位于其他地方)调用它时,它会工作一次并返回ERROR_INVALID_ADDRESS给其他人。

这意味着它不是加载DLL的问题,因为无论第一个DLL它都不起作用。

它的初始化如下:

并且被称为:

DllName 正确,dwBaseAddr 为 0。

根据MSDN SymLoadModuleEx 功能,一切都应该正常工作。

0 投票
1 回答
707 浏览

windows - 具有完整嵌入式调试符号的 Windows 可执行文件?

是否存在 Windows 可执行文件(使用 Visual Studio 用 C++ 编写)可以包含其完整调试符号的情况?还是仅包含在其 .pdb 文件中的全套调试符号?

有没有办法配置构建 Windows 应用程序,以便我们可以在没有 .pdb 文件的情况下对其进行调试?