c++ - 如何获取崩溃的 DLL 的堆栈跟踪?
问题描述
我为应用程序开发了一些 DLL,我想知道是否可以在我的 DLL 崩溃时获取堆栈跟踪(在日志文件中),然后不对主应用程序的代码进行任何修改。
这是一个 DLL 的虚拟示例,我想在它崩溃时记录堆栈跟踪:
你好DLL.h
#pragma once
//more about this in reference 1
#ifdef DLLDIR_EX
#define DLLDIR __declspec(dllexport) // export DLL information
#else
#define DLLDIR __declspec(dllimport) // import DLL information
#endif
class DLLDIR HelloDLL
{
public:
HelloDLL(void);
~HelloDLL(void);
void crash();
private:
void danger();
};
你好DLL.cpp
#include "stdafx.h"
#include "HelloDLL.h"
#include <iostream>
using namespace std;
HelloDLL::HelloDLL(void)
{
}
HelloDLL::~HelloDLL(void)
{
}
void HelloDLL::crash()
{
danger();
}
void HelloDLL::danger()
{
abort();
}
我无法更改的应用程序:
#include "stdafx.h"
#include "HelloDLL.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HelloDLL helloDLL;
helloDLL.crash();
getchar();
return 0;
}
我使用这个网站来创建这个例子。
换句话说,当我的 DLL 崩溃时,我怎样才能从它获得最大的信息,以便于调试过程?
解决方案
正如评论中所说,获取崩溃进程的堆栈跟踪的最佳方法是生成转储文件。为此,您首先需要编辑HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
注册表项。这是获取Hello.exe
应用程序完整转储的示例:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\Hello.exe]
"DumpCount"=dword:a
"DumpType"=dword:2
有关可用值的更多信息,请参见此处。默认情况下,转储文件将存储在%LOCALAPPDATA%\CrashDumps
.
然后,您需要在没有任何优化选项的情况下编译您的应用程序,并且您必须生成.pdb
文件(使用/DEBUG
选项)。
您现在可以运行程序并在CrashDumps
目录中转储文件。要阅读它,您可以使用 VisualStudio(也可以使用其他应用程序,例如 WinDbg):
- 使用 VisualStudio打开
.dmp
文件(您可以将文件拖放到打开的解决方案中) - 将
.pdb
文件添加到VisualStudio 的配置中(工具 > 选项 > 调试 > 符号) - 单击“仅使用本机运行”
现在,您可以在崩溃发生时获取所有线程的堆栈跟踪,还可以在程序停止之前读取变量的值。
推荐阅读
- windows - 无法在 cmd、Powershell 或 Vscode 中创建或更新文件。但我可以通过 Sublime、git bash 和文件资源管理器
- c - 目标通过标准输入传递的 CreateProcessW - 找不到目标
- c# - 使用 shift 键从 xy 更改为 xz 尺寸进行拖动 - 输入延迟问题
- django - 当您使用 form.is_valid 和 form.cleaned_data 时,django 清理和验证是什么?
- c++ - typeid() 或 dynamic_cast() 如何导致程序崩溃(使用 FLANN 库)?
- python - Python捕获终端输出
- wpf - WPF - 自动和按比例调整行大小的组合
- r - 在 R 中围绕特定目标日期的大型数据集中计算 30 天平均值
- c++ - 我不知道为什么我的 add 方法不起作用
- javascript - 表示已连接但未运行 onaddstream 函数的 iceConnectionState