首页 > 解决方案 > 如何获取崩溃的 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 崩溃时,我怎样才能从它获得最大的信息,以便于调试过程?

标签: c++debuggingloggingdllstack-trace

解决方案


正如评论中所说,获取崩溃进程的堆栈跟踪的最佳方法是生成转储文件。为此,您首先需要编辑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):

  1. 使用 VisualStudio打开.dmp文件(您可以将文件拖放到打开的解决方案中)
  2. .pdb文件添加到VisualStudio 的配置中(工具 > 选项 > 调试 > 符号)
  3. 单击“仅使用本机运行”

现在,您可以在崩溃发生时获取所有线程的堆栈跟踪,还可以在程序停止之前读取变量的值。


推荐阅读