【发布时间】:2018-11-27 02:06:26
【问题描述】:
我为一个应用程序开发了一些 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崩溃时,我怎样才能从DLL中获取最大的信息,以便于调试过程?
【问题讨论】:
-
崩溃的不是dll,而是进程崩溃。
-
@VTT 我同意,但我怎样才能获得与我的 DLL 关联的进程的堆栈跟踪?
-
可以获取执行线程的堆栈跟踪...设置故障转储生成主要是系统配置问题。虽然如果在发生致命错误的情况下执行某种手动操作,可能需要修改主应用程序的代码。
-
正如 VTT 所说,你不能只设置故障转储生成吗?
-
@ssbssa 你说得对,这可能是最好的方法。
标签: c++ debugging logging dll stack-trace