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

windows - PDB 文件未加载

我们的应用程序在嵌套目录中有一些 DLL 形式的附加组件。我们正在使用在后台运行的 DbgView 实例运行测试,通过该实例获取日志。问题是我们在与我们构建构建的计算机不同的计算机上运行测试。这会导致 PE 标头(通过 Dumpbin 工具提取)中的调试目录条目非常无效。

我们没有类似的符号服务器。然而,所有 PDB 文件都放置在调试版本中的二进制文件旁边,并具有正确的名称,因此我们希望可以毫无问题地找到它们。

加载项通过 LoadLibrary Windows 函数加载,然后使用 SymLoadModule64 函数加载符号表。根据返回值是正确的,但是当我们使用 SymGetModuleInfo64 检查实际加载的 PDB 时,它显示实际上什么都没有。这从导致我们深入修复应用程序的这一部分的原始问题也很明显,即上述调试日志中的调用堆栈,更准确地说是它们处理附加组件的部分被搞砸了。

尝试了各种版本的功能,并检查了 DbgHelp 库的版本,但无济于事。

从 VS 附加显示 VS 确实可以找到 PDB,而我们的符号加载机制和输出窗口中的日志仍然显示有问题的行为。VS 可以修复的只是混乱的调用堆栈。

DbgHelp 的符号加载使用应用程序的根目录初始化为“SymSearchPath”并启用了 DEFERRED_LOAD。后者我们需要删除,前者被设置为包含附加组件的目录。另一种解决方案是将 PDB 文件移至此根目录。

根据MSDN 上 SymInitialize的参考,递归搜索“SymSearchPath”以查找 PDB 文件,但实际上并非如此。另一件事是,每次我在网上浏览订单时,如何找到 PDB 文件的方法,它读取为第 1 或第 2 行,即从加载二进制文件的目录中搜索 PDB 文件,但作为我在上面已经解释过,这种情况也不会发生。

总而言之,虽然问题似乎解决了,但这里有很多令人困惑的事情。

所以..
1. 如果有人知道加载 PDB 文件的正确方式,那将会很有启发性。.. ?
2. DbgHelp 从根本上来说有问题吗?
3.为什么MSDN上说“SymSearchPath”没有递归搜索?

另外,如果您还有其他要添加的内容,也将受到欢迎。
感谢您阅读这么长的帖子。

0 投票
0 回答
651 浏览

c++ - StackWalk64 和自定义展开数据(x64 堆栈)检索

是否可以StackWalk64加载并使用我提取的 RUNTIME_FUNCTION 表?
我发现的唯一方法是在使用SymLoadModule64时加载它,它非常慢。

我还看到它StackWalk64可以接收一个函数,该函数每次都会为其提供适当的 RUNTIME_FUNCTION 条目,但它需要我实现部分未记录的 x64 UNWINDING 算法。

RtlInstallFunctionTableCallback是否可以使用or这样做RtlAddFunctionTable?它们有关系StackWalk64吗?
如果是这样,怎么办?我找不到这方面的例子。

0 投票
1 回答
673 浏览

windows - less stacks using StackWalk64

I built test.exe which will crash and generate .dmp file using MinidumpWriteDump, and parser.exe is used to read and print information from that dmp file.

In parser.exe I use StackWalk64 to get all stack traces of all threads in that dmp file. But now I found that I can only get less stacks than that visual studio did.

I've tried all solutions I could find in google、stackoverflow、codeproject, nothing changed.

The following is what parser.exe do:

  1. SymInitialize
  2. MiniDumpReadDumpStream to read all information
  3. SymLoadModuleEx & SymFindFileInPath to load pdb/exe/dll specified in .dmp file
  4. Initialize STACKFRAME64 and call StackWalk64 in loop.

I want to know how to get the same count of stack as visual studio. I could paste more code here if needed. Any help will be appreciated.

0 投票
1 回答
1854 浏览

windbg - 使用 dbghelp 查找类方法的符号地址

我正在尝试使用 dbghelp 来查找类方法的地址。例如,一个 DirectX 方法 (DXGI):dxgi!CDXGIFactory::CreateSwapChainImpl

我有正确的符号并定义了 _NT_SYMBOLS_PATH。使用 WinDBG,以下“x”命令运行良好:

但是,尝试将此字符串与 SymFromName 一起使用时,我收到错误 1168(未找到元素):

它失败是因为'::',还是因为同一个符号有两个地址(我该如何解决?)。

0 投票
1 回答
357 浏览

windows - Get access specifier for a class method from a PDB via DbgHelp?

Say I have a simple class like the one below:

Compiled with MSVC and parsing the corresponding PDB via the DbgHelp API, I can iterate over the children and parse out the methods and variables fine, but I am unable to figure out how I determine the access specifier for a given child. My code looks something like this:

Is it possible to determine the access specifiers (public, private, protected) for a classes children via the DbgHelp API, and if so, how?

0 投票
2 回答
317 浏览

c# - 如何使用 C# 从 C++ 应用程序获取调用堆栈?

我有 C#/VB.NET 应用程序,它测试用 C++ 编写的其他应用程序。如果 C++ 应用程序没有响应,我想从中获取调用堆栈。我发现了各种用 C++ 编写的示例(例如 dbghelp.dll CaptureStackBackTraceWalking the callstack),但我在编写的C# 中一无所获。你能帮我吗?

0 投票
1 回答
190 浏览

c# - 如何在 MSVC++ 中获得相当 C# 风格的堆栈跟踪?

在 C# 中,您将获得以下类型的堆栈跟踪:

我想在 C++ 中做同样的事情,但我不确定两件事......你如何获得文件以及你所在的行号?

到目前为止我工作的示例代码:

输出:

0 投票
2 回答
2980 浏览

c++ - SymGetLineFromAddr 无法正常工作

我有以下代码:

问题是它总是在这一行出错:printf("at %s in %s, address 0x%0X\n", symbol->Name, line->FileName, symbol->Address);

原因是因为 line 的 FileName 似乎为 NULL。实际上,整个线路结构是混乱的。我正在尝试编写一个应用程序来显示错误的堆栈跟踪。但这是为什么呢?它不应该使用上面的代码工作吗?PS 我针对 Win32 编译它,作为一个简单的 MSVC++ 控制台应用程序。

0 投票
3 回答
16221 浏览

c++ - 如何使用 CaptureStackBackTrace 来捕获异常堆栈,而不是调用堆栈?

我标记了以下代码:

它的作用是记录堆栈跟踪,但问题是它记录的堆栈跟踪没有给我想要的行号。我希望它在调用堆栈上记录引发异常的位置的行号,有点像在 C# 中。但它现在实际做的是输出以下内容:

我再次面临的问题是,line: 68在此跟踪中对应于调用方法的行printStackTrace();,而我希望它给我第 45 行,它对应于引发异常的行:throw new exception;然后继续向上堆栈。

我怎样才能实现这种行为并在它抛出这个异常时准确地进入这个线程以获得正确的堆栈跟踪?

PS 上面的代码是为使用 MSVC++ 的控制台应用程序运行的,在 Windows 8.1 x64 机器上启用了 unicode,应用程序在调试模式下作为 Win32 应用程序运行。

0 投票
1 回答
5595 浏览

c++ - 为什么 SymGetSymFromAddr64 不起作用?它返回错误代码 126

我正在尝试使用以下代码捕获异常的堆栈跟踪:

输出:

我对 SymGetSymFromAddr64 失败的原因感到有些困惑。有任何想法吗?

126 应该是缺少的依赖项,但我在适当的文件夹中有 DLL...我正在使用 Win32 平台调试版本的 Windows 8.1 x64 PC 上的 MSVC++ 控制台应用程序中运行这一切。那么可能导致问题的原因是什么?

更新:Dependency walker 告诉我它找不到 API-MS-WIN-SERVICE-PRIVATE-L1-1-1.DLL