问题标签 [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 - 为什么使用 SetUnhandledExceptionFilter 时堆栈行走不能正常工作?
我正在使用以下代码在异常上遍历堆栈(注意:您必须在发布中运行它才能正确地将堆栈跟踪的所需输出接收到控制台,而不是在调试模式下,否则它只会显示一个弹出窗口):
输出:
问题是,上面的跟踪只包含,它对应于对inline: 135
的调用。但是,我希望它包含作为堆栈跟踪的一部分,它在哪里执行. 为什么不将其包含在堆栈跟踪中?我怎样才能让它也包括堆栈跟踪的这一部分?到目前为止,我能够实现此功能的唯一方法是使用并阻止对;的调用。并将 except 传递给 a,但这并不好,因为它有自己的警告,因为它必须在任何地方使用,我想要一个顶级解决方案。我想捕获所有顶级异常,并且我想确切地知道它们被抛出的位置。function0();
threadFunction
line: 29
throw new exception;
__try
__except(FatalExceptionFilter(GetExceptionCode(), GetExceptionInformation()))
function0()
FatalExceptionFilter
PS 此代码在 Windows 8.1、64 位机器下运行。它是一个在 Release 构建/平台 x64 下编译的 MSVC++ 控制台应用程序。
更新:我已经尝试使用 _set_se_translator 方法和 Petr 的建议进行以下操作,但它似乎仍然不想工作。事实上,除以零异常被抛出未处理,并且没有任何处理它:
c++ - 在 Windows 8.1 Update 1 上使用 dbghelp.dll 会导致应用程序崩溃
我刚刚将我的 Windows 8.1 Enterprise 版本更新为 Update 1(本周黑色星期二版本中发布的最新补丁)。
我运行了我的一个 MSVC++ 应用程序,它使用了 dbghelp.dll 中的 WINAPI 方法,但它崩溃了。我发现的唯一原因是因为我检查了事件查看器以查看是否有任何错误。果然,有:
那么我应该为 8.1 Update 1 使用此 DLL 的修补程序或不同版本吗?
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.
winapi - StackWalk64 似乎有效,但 SymFromAddr 返回虚假名称
我实现了以下函数来获取 Windows 上的当前堆栈:
堆栈遍历似乎按预期工作,我得到的帧数与调试器中的帧数一样多。也可以SymGetModuleBase64
正常GetModuleFileName
工作以解析模块名称。
但是调用SymFromAddr
总是给我一个模块相同的功能。每个地址都不同,测试一些地址,它们看起来是正确的。
PDB 是使用 /Zi 和 /DEBUG 生成的。
知道我能做些什么来让它正常工作吗?
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 位?
c - 从已卸载模块的 pdb 中提取结构信息
我正在尝试编写一个适用于实时远程目标和故障转储的 WinDbg 调试器扩展。这个扩展通过结构偏移分析一个不透明的内存块,并将它的不同区域投射到已知对象。
这些结构会更改版本之间的字段/字段顺序,因此我无法在调试器扩展本身中对其进行硬编码(或包含标头)。相反,我想从我拥有私有符号的 pdb 中提取结构信息。
在 pdb/image 位于加载的模块列表中的实时目标上使用它时,效果很好,我可以使用GetFieldOffset之类的函数来获取类结构中的字段。
我的问题:当我在加载的模块列表中没有该模块时(在错误的上下文中,或分析故障转储),我无法使用上述功能。
在我正在分析的内存区域的开头,我存储了 pdb GUID 和年龄。使用它,我可以使用SymFindFileInPath在我的符号路径/符号缓存中找到我的 pdb 的路径。
所以我有我的特定 pdb 实例的路径,但我不确定从这里去哪里。查看 DbgHelp.dll 公开的Sym* 函数,我看不到任何明显的方法可以使用此 pdb 文件来获取类型信息。SymGetTypeInfo等函数需要模块库,而我的模块没有也无法加载。我需要的只是结构中字段的字节偏移量。有任何想法吗?
谢谢!
c++ - 如何通过 DbgHelp 获取局部变量的值
如何通过 DbgHelp 获取局部变量的值?我尝试使用以下代码
但reinterpret_cast<void*>(pSymInfo->Address)
总是返回像 FFFFFFD4 这样的地址。
为什么?我究竟做错了什么?我该如何解决?
提前致谢。
c++ - 如何将 ULONG64 转换为指针
我有一个ULONG64
来自结构的变量,SYMBOL_INFO
其中包含表示为 18446744073709551572 值的虚拟地址,我需要将其转换为,void*
以便将其传递给ReadProcessMemory
函数。
如果我只是这样做
它给了我FFFFFD4。
为什么?我究竟做错了什么?我该如何解决?
提前致谢。
c++ - 从调用栈地址获取函数参数
我正在打印一些关于调用堆栈的调试信息。我可以使用SymFromAddr轻松获取函数名称
但是,我想重现函数的完整签名,以便消除覆盖之间的歧义,并基本上重现 Visual Studio 调用堆栈窗口中显示的内容。我无法找到实现此目的的 api 调用。
有吗?