我为应用程序开发了一些DLL,我想知道当它崩溃时是否有可能获得我的DLL的堆栈跟踪(在日志文件中),然后在主应用程序的代码中不做任何修改。
这是我想在崩溃时记录堆栈跟踪的DLL的虚拟示例:
HelloDLL.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();
};
HelloDLL.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;
}
我使用this website来创建此示例。
换句话说,如何在崩溃时从DLL中获取最大信息以便于调试过程?
答案 0 :(得分:0)
如评论中所述,获取崩溃进程的堆栈跟踪的最佳方法是生成转储文件。为此,您首先需要编辑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
有关可用值的更多信息,请参见here。默认情况下,转储文件将存储在%LOCALAPPDATA%\CrashDumps
中。
然后,您需要在不使用任何优化选项的情况下编译应用程序,并且必须生成.pdb
文件(使用/DEBUG
选项)。
您现在可以运行程序并转储CrashDumps
目录中的文件。要阅读它,您可以使用VisualStudio(例如,还可以使用其他应用程序,例如WinDbg):
.dmp
文件(您可以将文件放入打开的解决方案中).pdb
文件添加到configuration of VisualStudio(工具>选项>调试>符号)现在,当发生崩溃时,您可以获取所有线程的堆栈跟踪,还可以在程序停止之前读取变量的值。