问题标签 [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 回答
1751 浏览

winapi - 为什么使用 SetUnhandledExceptionFilter 时堆栈行走不能正常工作?

我正在使用以下代码在异常上遍历堆栈(注意:您必须在发布中运行它才能正确地将堆栈跟踪的所需输出接收到控制台,而不是在调试模式下,否则它只会显示一个弹出窗口):

输出:

问题是,上面的跟踪只包含,它对应于对inline: 135的调用。但是,我希望它包含作为堆栈跟踪的一部分,它在哪里执行. 为什么不将其包含在堆栈跟踪中?我怎样才能让它也包括堆栈跟踪的这一部分?到目前为止,我能够实现此功能的唯一方法是使用并阻止对;的调用。并将 except 传递给 a,但这并不好,因为它有自己的警告,因为它必须在任何地方使用,我想要一个顶级解决方案。我想捕获所有顶级异常,并且我想确切地知道它们被抛出的位置。function0();threadFunctionline: 29throw new exception;__try__except(FatalExceptionFilter(GetExceptionCode(), GetExceptionInformation()))function0()FatalExceptionFilter

PS 此代码在 Windows 8.1、64 位机器下运行。它是一个在 Release 构建/平台 x64 下编译的 MSVC++ 控制台应用程序。

更新:我已经尝试使用 _set_se_translator 方法和 Petr 的建议进行以下操作,但它似乎仍然不想工作。事实上,除以零异常被抛出未处理,并且没有任何处理它:

0 投票
0 回答
1325 浏览

c++ - 在 Windows 8.1 Update 1 上使用 dbghelp.dll 会导致应用程序崩溃

我刚刚将我的 Windows 8.1 Enterprise 版本更新为 Update 1(本周黑色星期二版本中发布的最新补丁)。

我运行了我的一个 MSVC++ 应用程序,它使用了 dbghelp.dll 中的 WINAPI 方法,但它崩溃了。我发现的唯一原因是因为我检查了事件查看器以查看是否有任何错误。果然,有:

那么我应该为 8.1 Update 1 使用此 DLL 的修补程序或不同版本吗?

0 投票
1 回答
413 浏览

windows - IDebugSymbols doesn't find symbols in symbol server

I am writing a small application that prints out the call stack of a given crash dump. The code is more or less base on this tutorial: http://blogs.msdn.com/b/joshpoley/archive/2008/05/27/opening-a-crash-dump-file-automating-crash-dump-analysis-part-1.aspx?Redirected=true

The code works fine when the debug symbol is alongside the crash dump. However my application can't find the debug symbol when it lives in a symbol server. My symbol server is specified in _NT_SYMBOL_PATH. I am pretty sure there is nothing wrong with _NT_SYMBOL_PATH and the symbol server because when I open the crash dump in Visual Studio and WinDbg, they are able to find the symbol in the symbol server.

I added the SYMOPT_DEBUG option to my instance of IDebugSymbols and I get the following output:

DBGHELP: _NT_SYMBOL_PATH:

DBGHELP: Symbol Search Path:

I guess that means that my instance of IDebugSymbols knows about the symbol server.

Does anyone have any idea of what I am doing wrong?

Thanks in advance.

0 投票
1 回答
1069 浏览

winapi - StackWalk64 似乎有效,但 SymFromAddr 返回虚假名称

我实现了以下函数来获取 Windows 上的当前堆栈:

堆栈遍历似乎按预期工作,我得到的帧数与调试器中的帧数一样多。也可以SymGetModuleBase64正常GetModuleFileName工作以解析模块名称。

但是调用SymFromAddr总是给我一个模块相同的功能。每个地址都不同,测试一些地址,它们看起来是正确的。

PDB 是使用 /Zi 和 /DEBUG 生成的。

知道我能做些什么来让它正常工作吗?

0 投票
1 回答
480 浏览

c# - 'SymEnumSymbols' API 仅检索每个方法名称的首字母

我正在使用解决方案从非托管 C++ 库中检索方法名称,该解决方案使用SymEnumerateSymbols64函数,但 MSDN在这里说应用程序必须SymEnumSymbols改为使用,所以我找到另一个解决方案,但是当我尝试调整和翻译C#将代码转换为VB.NET代码该SYMBOL_INFO.Name属性只包含方法名的第一个字母。

问题出在哪里以及如何解决?

我认为问题可能是结构内的声明:

...但是如果我删除编组,应用程序就会自行关闭,没有任何异常。

这是完整的代码:

这是一个真实的示例用法:

0 投票
0 回答
100 浏览

c - 从 FileHeader.Machine 判断位数

注意:(1) 我在 Windows 7 64 位中工作,(2) 我已经看到了如何测试 Windows DLL 文件以确定它是 32 位还是 64 位?.

我正在尝试编写一个检查 DLL 位数的 C 程序。使用 Windows API 和调试帮助库,我可以访问 NT Header 的 FileHeader.Machine。

我的程序似乎适用于 32 位 DLL,但错误地将 C:\Windows\System32\KERNEL32.DLL 识别为 32 位(为什么在 64 位 Windows 上 64 位 DLL 转到 System32 和 32 位 DLL 到 SysWoW64?)。

我查看了 Dependency Walker,但在 32 位和 64 位版本的depends.exe 之间得到不一致的结果——C:\Windows\System32\KERNEL32.DLL 被 32 位版本的depends.exe 识别为 32 位 (CPU: x86),但被 64 位版本识别为 64 位 (CPU: x64)。

FileHeader.Machine 不是要走的路吗?64 位版本的depends.exe 如何将DLL 识别为64 位?

0 投票
2 回答
1417 浏览

c - 从已卸载模块的 pdb 中提取结构信息

我正在尝试编写一个适用于实时远程目标和故障转储的 WinDbg 调试器扩展。这个扩展通过结构偏移分析一个不透明的内存块,并将它的不同区域投射到已知对象。

这些结构会更改版本之间的字段/字段顺序,因此我无法在调试器扩展本身中对其进行硬编码(或包含标头)。相反,我想从我拥有私有符号的 pdb 中提取结构信息。

在 pdb/image 位于加载的模块列表中的实时目标上使用它时,效果很好,我可以使用GetFieldOffset之类的函数来获取类结构中的字段。

我的问题:当我在加载的模块列表中没有该模块时(在错误的上下文中,或分析故障转储),我无法使用上述功能。

在我正在分析的内存区域的开头,我存储了 pdb GUID 和年龄。使用它,我可以使用SymFindFileInPath在我的符号路径/符号缓存中找到我的 pdb 的路径。

所以我有我的特定 pdb 实例的路径,但我不确定从这里去哪里。查看 DbgHelp.dll 公开的Sym* 函数,我看不到任何明显的方法可以使用此 pdb 文件来获取类型信息。SymGetTypeInfo等函数需要模块库,而我的模块没有也无法加载。我需要的只是结构中字段的字节偏移量。有任何想法吗?

谢谢!

0 投票
1 回答
451 浏览

c++ - 如何通过 DbgHelp 获取局部变量的值

如何通过 DbgHelp 获取局部变量的值?我尝试使用以下代码

reinterpret_cast<void*>(pSymInfo->Address)总是返回像 FFFFFFD4 这样的地址。

为什么?我究竟做错了什么?我该如何解决?

提前致谢。

0 投票
1 回答
240 浏览

c++ - 如何将 ULONG64 转换为指针

我有一个ULONG64来自结构的变量,SYMBOL_INFO其中包含表示为 18446744073709551572 值的虚拟地址,我需要将其转换为,void*以便将其传递给ReadProcessMemory函数。

如果我只是这样做

它给了我FFFFFD4。

为什么?我究竟做错了什么?我该如何解决?

提前致谢。

0 投票
1 回答
358 浏览

c++ - 从调用栈地址获取函数参数

我正在打印一些关于调用堆栈的调试信息。我可以使用SymFromAddr轻松获取函数名称

但是,我想重现函数的完整签名,以便消除覆盖之间的歧义,并基本上重现 Visual Studio 调用堆栈窗口中显示的内容。我无法找到实现此目的的 api 调用。

有吗?