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

c++ - MiniDumpWriteDump() 挂起

如果堆分配/解除分配/重新分配正在另一个线程中进行,则 DbgHelp 库的 MiniDumpWriteDump() 会挂起。这是调用堆栈: DbgHelp 暂停其他线程,然后无限期地等待这些线程获得的互斥体。

您知道这种情况的简单解决方法吗?我可以看到将检查注入应用程序中所有其他线程的解决方法,以查看是否请求了核心转储,然后在没有获得互斥锁的地方暂停。但这是一个很大的变化,加上应用程序的一些线程是我无法控制的,因为它们是由我用于内部使用的库启动的。

0 投票
1 回答
64 浏览

windows - 我是否需要保存多个 PDB 才能调试故障转储文件?

为了正确调试客户发送给我的故障转储文件,我需要保存多少原始版本?显然我需要 PDB 我还需要其他东西吗?

(这将用于MiniDumpWriteDump由 dbghelp.dll 中的函数编写的故障转储文件。)

到目前为止,我一直保存整个构建文件夹。代码、PDB、.OBJ 文件、输出二进制文件,应有尽有。只是为了安全。我想尽量减少我保存的内容。但我无法找出我错过了什么的艰难方式。

实际的源代码将在源代码控制中并带有构建标签,因此我可以按标签提取并准确获取我以前构建的内容。在调试崩溃转储之前,我什至需要费心拉取源代码,还是只拥有 PDB 就足够了?

0 投票
1 回答
302 浏览

c++ - 为什么我会收到来自 SymInitialize 的虚假错误消息?

在编写 C++ Windows 应用程序时,我使用SymInitializeW来初始化符号以获取回溯。正如文档所述,我正在检查返回代码,然后在 SymInitializeW 返回 false 时使用GetLastError 和 FormatMessage (如示例中所示)。

但是,当我这样做时,我收到“传递给系统调用的数据区域太小”的错误消息。我不确定那指的是什么,因为实际上没有传递“数据区域”——只有进程句柄、搜索路径的 PCWSTR 和布尔值。-- 看起来符号加载有效,这让人倍感困惑。(例如,如果我跳过错误处理,事情似乎工作正常。)

此消息是否指向我实际上做错的事情,还是虚假的?如果是虚假的,为什么 SymInitializeW 返回 false?

0 投票
0 回答
166 浏览

c++ - 为什么 dbghelp.h 的符号相关函数总是返回 126 错误代码?

当我尝试使用 SymbolFromName() e SymbolFromAddress() 函数时,返回代码总是返回 126 (MODULE_NOT_FOUND),代码是:

我使用 VisualStudio 和默认调试器来测试它。上面的部分代码取自 MSDN 文档,这里是。

编辑:感谢nm我知道主要的符号,它可以提取符号列表,在我的例子中它包含:

我也尝试使用不同的符号名称,如 main、mainCRTStartup、wWinMain、WinMain 等,但没有任何结果

0 投票
1 回答
118 浏览

c++ - 无法让 SymGetTypeInfo 工作(错误 1,函数不正确)

TLDR:有人可以解释如何正确使用SymGetTypeInfo.

我的目标是获取局部变量的类型信息(无论Rip/Eip碰巧在哪里)。

根据文档,我需要使用填充适当值SymSetContext的结构来调用。IMAGEHLP_STACK_FRAME我在调用时使这部分工作SymEnumSymbols(将BaseOfDll参数设置0为文档在设置上下文时所说的),实际上我只获取局部变量。

但是

在枚举符号回调中,我尝试调用SymGetTypeInfo,如下所示:

SymGetTypeInfo失败并出现错误 1(“功能不正确”)。

好的,现在我正在排除故障以找出为什么会发生这种情况。我的第一个理论是这可能与设置上下文有关,所以我删除SymSetContext并再次枚举。这一次(我显然得到了所有符号),除了少数类型之外,我得到了同样的问题,特别是:我能够得到__scrt_current_native_startup_state (即__scrt_native_startup_state)的类型。

好吧,也许...问题是我在 Sym* 回调函数中调用 SymGetTypeInfo ?(虽然怀疑)。无论如何,我对理论进行了测试,并仅列举了我在全球范围内定义的符号:

再一次,不设置上下文,我枚举符号并记下TypeIndex每个符号的值,以便在枚举符号函数之外,我SymGetTypeInfo这样调用:

(process_pdb_baseSymModuleLoad64) 返回。

我遇到了同样的问题。

也许我完全误解了TypeIndex真正的东西是什么?(尽管对于具有相同类型的不同变量是一致的),或者它可能仅适用于用户定义的类型??

所以是的,我迷路了,累了,请帮助上网。

0 投票
0 回答
40 浏览

visual-c++ - 包含 .lib 时,LNK2019 仍然存在

正如标题所说,我正在尝试使用静态库(dbghelp.lib)。我在链接器/输入/附加依赖项中设置的文件夹中有.lib。我还添加了 Linker/General 中的其他库目录文件夹。我仍然收到以下错误

我已经包含了 DbgHelp.h,并且当它运行时我将 DLL 放在同一个文件夹中。为什么会这样?配置是正确的,它是活动的配置和平台,我重建了项目,它仍然发生。我正在构建为 Win32。

0 投票
0 回答
105 浏览

c++ - 在您的应用程序中使用 dbghelp 的最佳实践

我有一个企业 c++ 应用程序,我想发布它,dbghelp如果我的应用程序崩溃,我确实使用该库来获取堆栈跟踪。这样做的最佳做法是什么?

我的目标用户是windows10,根据这个页面,我应该可以一起发货dbghelp.dll吧?“这些包含的 DLL 的再分发策略专门设计用于使人们尽可能轻松地将这些文件包含在他们自己的包和版本中。”

0 投票
1 回答
72 浏览

multithreading - 关于线程安全的 DbgHelp vs DbgEng vs DIA SDK

所有这些 API(DbgHelp、DbgEng、DIA SDK)都可用于从函数指针中恢复函数名称/源文件位置,因此可用于解密堆栈跟踪。

但是,每个 DbgHelp 函数都有以下注释:

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

至于 DbgEng,没有这样的声明,但是它似乎是基于 DbgHelp,所以不能是线程安全的:即使 DbgEng 保护对 DbgHelp 的每次调用,也可能不是来自 DbgEng 的对 DbgHelp 的调用,而是直接来自用户的代码。

恐怕 DIA SDK 也是使用 DbgHelp 实现的。

那么是否有任何健壮的符号 API 可用于为多线程应用程序设计的库中?

0 投票
0 回答
24 浏览

c++ - win 11 的 minidump 中没有模块信息

我在 win 11 上的应用程序有问题。

由于某种原因,在运行我的应用程序的 win10 版本时,minidump 崩溃文件中没有需要的信息。使用 minidump_dump 工具我发现,在 minidump 文件中,主模块没有 debug_id 和 pdb_file 信息。奇怪的是,在运行win32版本或从Visual Studio运行应用程序并成功crash(对于这个版本crash有需要的信息)后,win10版本的crash变成了需要的信息。这一直持续到重新启动计算机。

我们使用 dbghelp.dll 库,方式如下(这不是全部代码,只是一些操作):

我们在这部分没有任何特定于平台的代码(对于win10和win11,此代码相同),但由于某种原因,在win11上此代码不起作用。我会很高兴有任何关于为什么会发生这种情况的信息和想法。win10 和 win11 的唯一区别是 dbghelp.dll 的版本,但是这个库的代码没有开放,所以我不知道为什么会发生这种情况。

这里 minidump_dump 分析有无所需信息的崩溃:

  • 没有:
  • 和: