问题标签 [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.
winapi - 如何让 dbghelp 从自定义符号存储中加载符号?
SymInitialize 和 SymFromAddr 方法有没有办法从自定义符号存储中自动加载符号。我正在尝试使用 SymFromAddr() 将地址解析为可读的函数名称。如果我在本地存储了给定模块的符号,它似乎工作正常,但是我希望它自动从提供给 SymInitialize 的路径下载它们,就像 WinDbg 那样。我这样称呼 SymInitialize :
SymFromAddr 返回错误 487“尝试访问无效地址”。因为它甚至从未尝试下载它,所以找不到该符号。
有什么办法可以强制下载吗?
c - SymFromAddr 与给定地址的调试器符号不匹配
在我的 Windows 应用程序中,我使用 MinHook ( https://github.com/TsudaKageyu/minhook ) 钩住了 malloc) 我正在使用 CaptureStackBacktrace 和 SymFromAddr 来获取内存泄漏的符号。SymFromAddr 对我的可执行文件中的地址工作可靠,但是当报告来自 DLL 的地址的符号信息时,结果通常不正确。SymFromAddr 不报告错误,它只是返回错误信息。不过,调试器能够获得正确的信息(我可以将鼠标悬停在传递给 SymFrommAddr 的地址上,Visual Studio 会正确报告模块和函数名称)。我认为我的问题可能是错误的符号搜索路径,因此我更新了对 SymInitialize 的调用以包含 MS 符号服务器和可执行文件的路径,但这并没有解决问题。
Visual Studio 调试器是否使用 dbghelp 系统?有没有人知道为什么调试器和 SymFromAddr 不同意?
c - 符号枚举回调函数多次调用同一个符号?
我编写了一个小程序,它使用 dbghelp 库打印某些可执行文件的所有符号。我调用的主要枚举函数是: SymEnumSymbols 应该接收一个回调,该回调将为每个符号调用。我尝试在 kernel32.dll 上运行该程序,但遇到了 2 个奇怪的问题:
1)有些符号位于同一地址,但它们在 SYMBOL_INFO 结构的所有字段值中都相等(除了唯一索引字段) - 那么我如何区分?(例如:0x6b814c23 -StringCopyWorkerW)
2)在某些情况下,同一地址中有两个具有相同特征的符号。(当我在 IDA 中打开文件时,我看到有两个导出的条目 - 但一个是函数,另一个不是(例如:WerGetFlag 和 WerGetFlagsWorker,它们位于 0x6b84c840)。
谢谢!
这是代码:
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,并安装不同的版本,仍然出现同样的错误。
windows - 是否可以使用 dbghelp.dll 从给定地址获取汇编代码?
我可以通过调用 SymGetLineFromAddr64()
dbghelp.dll 使用 dbghelp.dll 在给定地址获取行信息。
它只给我该地址的源代码信息(例如行号和文件名)。但是,在 WinDBG 中,我也可以获得给定地址的汇编代码。我不确定如何使用 dbghelp.dll 来做到这一点。如果不可能,我可以使用任何其他 dll 吗?
c++ - 加载调试符号而不锁定文件
我正在尝试使用 DbgHelp 为某些模块加载调试符号,而不锁定 PDB 文件,以便我们的客户可以在它们仍由我们加载时删除它们。
我尝试使用FILE_SHARE_DELETE
标志创建一个文件,然后SymLoadModule64
使用该文件调用,但没有成功:
符号已正确加载,但文件仍处于锁定状态。如果我在调用 EnumerateLoadedModules64 之前停止程序,我可以删除 PDB。
您知道是否可以在不锁定文件的情况下加载符号?
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 的任何函数。
有关的:
c++ - SymEnumSymbols 返回 ERROR_SUCCESS 但没有给出任何结果
我正在尝试从已加载的 DLL 中枚举符号。对于那些感兴趣的人,这是CPPCoverage 项目的一部分,对于某些功能,我需要符号数据。
问题的分解
当进程启动或加载 DLL 时,需要为一些已计划的新功能枚举符号。
基本上,创建了一个进程,dbghelp
用于获取符号信息。接下来,使用 迭代符号SymEnumSymbols
。发生这种情况有两个时刻:
- 进程启动时 (
CREATE_PROCESS_DEBUG_EVENT
) - 加载 DLL 时 (
LOAD_DLL_DEBUG_EVENT
)
在 (2) 期间一切正常。但是,在 (1) 期间不能枚举符号。
行为是一切正常,直到SymEnumSymbols
调用。返回值告诉我有一个错误,但GetLastError
返回成功。此外,不会调用回调函数。
更奇怪的是,调用SymGetSymFromName
确实有效。
最小测试用例
c++ - SymLoadModuleEx 返回 ERROR_INVALID_ADDRESS
我使用SymLoadModuleEx
的是Dbghelp.h
VS2015 附带的。该函数只工作一次,并ERROR_INVALID_ADDRESS
为下一次调用返回。当我更改调用顺序以便为另一个 DLL(完全不同,甚至位于其他地方)调用它时,它会工作一次并返回ERROR_INVALID_ADDRESS
给其他人。
这意味着它不是加载DLL的问题,因为无论第一个DLL它都不起作用。
它的初始化如下:
并且被称为:
DllName 正确,dwBaseAddr 为 0。
根据MSDN SymLoadModuleEx 功能,一切都应该正常工作。
windows - 具有完整嵌入式调试符号的 Windows 可执行文件?
是否存在 Windows 可执行文件(使用 Visual Studio 用 C++ 编写)可以包含其完整调试符号的情况?还是仅包含在其 .pdb 文件中的全套调试符号?
有没有办法配置构建 Windows 应用程序,以便我们可以在没有 .pdb 文件的情况下对其进行调试?