linux服务器内存崩溃调试方法

在编写linux服务器过程中,由于没有图形界面以供调试,并且在多线程的情况下,很多时候用跟代码的方式是找不出问题所在的,那么遇到这类异常崩溃的时候我们如何定位问题呢?答案是打印崩溃调用堆栈。


首先我们要有一个打印调用堆栈的函数,其次我们需要在main中加入signal(SIGSEGV, &print_trace_Mem_Break);

                打印函数代码为:

void print_trace_Mem_Break(int signo)

{
int j, nptrs;
void *buffer[100];
char **strings;
//muduo::MutexLockGuard lock(filemutex_);
time_t now;
struct tm  *timenow;
time(&now);
timenow = localtime(&now);


char fileName[100];
sprintf(fileName, "Mem-Break-MK-%d-%d-%d.err.log", timenow->tm_year + 1990, timenow->tm_mon + 1, timenow->tm_mday);
FILE *fp = fopen(fileName, "a+");


fprintf(fp, "\n\n\n-----MK---MEM-Break----%d-%d-%d-%d-%d-%d-----------\n", timenow->tm_year + 1990, 
timenow->tm_mon + 1, timenow->tm_mday, timenow->tm_hour, timenow->tm_min, timenow->tm_sec);
nptrs = backtrace(buffer, 30);
fprintf(fp, "backtrace() returned %d addresses\n", nptrs);


strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL)
{
perror("backtrace_symbols");
fclose(fp);
exit(0);
}


for (j = 0; j < nptrs; j++)
fprintf(fp, "%s\n", strings[j]);


fclose(fp);
free(strings);
exit(0);
}

                这个函数调用堆栈打印函数在linux环境下调试还有很多妙用,比如说我们编写的多线程程序大多数情况需要加锁,但是有时候不注意会造成死锁,这类问题又很难定位,那么我们的函数调用堆栈打印函数就派上用处了,在每个加锁的地方,判断一下此锁是否已经被本线程锁住,如果锁住就打印出函数调用堆栈信息。

               像这样:

if (mutex_.isLockedByThisThread())
{
print_trace_Mem_Break();
}

当然,需要对锁进行封装,这类代码太多,在网上很容易找到,实在找不到就参考一下muduo网络库里base里面的MutexLockGuard和MutexLock。

你可能感兴趣的:(linux)