相关疑难解决方法(0)

我的程序崩溃时如何自动生成堆栈跟踪

我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.

我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).

我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?

c++ crash gcc assert stack-trace

561
推荐指数
20
解决办法
33万
查看次数

__builtin__FUNCTION()是否有MSVC等效?

根据这个答案,我们可以__builtin__FUNCTION()在GCC中找到调用函数的名称.MSVC是否相当于此?

c++ visual-studio

6
推荐指数
1
解决办法
340
查看次数

dladdr不返回函数名称

我正在尝试使用dladdr。它可以正确找到该库,但是找不到函数名称。我可以调用objdump,做一些数学运算,然后获取传递dladdr的函数的地址。如果objdump可以看到它,为什么不能dladdr?

这是我的功能:

const char *FuncName(const void *pFunc)
{
Dl_info  DlInfo;
int  nRet;

    // Lookup the name of the function given the function pointer
    if ((nRet = dladdr(pFunc, &DlInfo)) != 0)
        return DlInfo.dli_sname;
    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

这是显示我得到的gdb成绩单。

Program received signal SIGINT, Interrupt.
[Switching to Thread 0xf7f4c6c0 (LWP 28365)]
0xffffe410 in __kernel_vsyscall ()
(gdb) p MatchRec8Cmp
$2 = {void (TCmp *, TWork *, TThread *)} 0xf1b62e73 <MatchRec8Cmp>
(gdb) call FuncName(MatchRec8Cmp)
$3 = 0x0
(gdb) call FuncName(0xf1b62e73)
$4 = 0x0
(gdb) b FuncName …
Run Code Online (Sandbox Code Playgroud)

c linux elf

5
推荐指数
2
解决办法
1万
查看次数

C++中获取调用函数的名称、行号和文件名

我编写了以下代码来将日志写入我的日志文件中。这段代码可以很好地记录消息,但现在我必须将其集成到多个文件中,我需要调用者的文件路径、调用者函数名称和行号。

请帮助我实现这一目标。

#include "Source.h"

bool CLogManager::fileOpenError = false;
std::string CLogManager::logFileName = "";
CLogManager* CLogManager::logManager = NULL;
FILE* CLogManager::file = NULL;

CLogManager :: CLogManager(){}
CLogManager :: ~CLogManager()
{
    if (file)
        fclose(file);
}
CLogManager* CLogManager::getInstance()
{
    if(logManager==NULL)
    {
        logManager = new CLogManager();
        logFileName = currentDateTime();
    }
    return logManager;
}
const std::string CLogManager::currentDateTime()
{
    time_t now = time(0);
    char currTime[30];
    strftime(currTime, sizeof(currTime), "Log_%Y_%m_%dT%H_%M_%S.xml", localtime(&now));
    return currTime;
}
void CLogManager::Log (char *message)
{
    file = fopen(logFileName.c_str(), "a+");
    if(file == NULL) 
    {
        if(fileOpenError == false) …
Run Code Online (Sandbox Code Playgroud)

c++ error-logging

4
推荐指数
1
解决办法
8358
查看次数

标签 统计

c++ ×3

assert ×1

c ×1

crash ×1

elf ×1

error-logging ×1

gcc ×1

linux ×1

stack-trace ×1

visual-studio ×1