linux下怎么查看程序异常,如何检测、定位linux程序异常

作为linux开发,在工作中或者面试的时候经常会遇到怎么检测程序异常的问题,下面对此作一个总结。

0.

查看程序日志、项目更新日志,发现可疑的地方

使用linux查看内存cpu指令,top、ps初步看看问题在哪

有工具可以查看内核执行状态,各种指令的执行状态

1. 调试core文件

首先,查看core文件的开关是打开[ulimit -c],如果没有则编辑root用户的[/etc/profile]文件,或当前用户的[.bash_profile]文件,在文件末尾加上[ulimit -c unlimited],保存退出后输入[source

.bash_profile]让配置生效。然后程序异常退出的时候,会在程序所在的目录生成core.***文件

然后,程序异常退出时调试core文件即可,输入[gdb *** core.***],或者[gdb ***]再[core-file core.***],自动跳转到出错误的地方

2. 程序退出时打印栈信息,然后根据出错地址定位到代码

首先,在程序中加入信号相应函数,作用时在程序异常退出时打印栈信息

如下代码,编译得到有问题的可执行文件:

#include "stdlib.h"

#include "stdio.h"

#include "signal.h"

#include "execinfo.h"

void fun_dump( int no)

{

char _signal[64][32] = {

"1: SIGHUP", "2: SIGINT", "3: SIGQUIT", "4: SIGILL",

"5: SIGTRAP", "6: SIGABRT", "7: SIGBUS", "8: SIGFPE",

"9: SIGKILL", "10: SIGUSR1", "11: SIGSEGV", "12: SIGUSR2",

"13: SIGPIPE", "14: SIGALRM", "15: SIGTERM", "16: SIGSTKFLT",

"17: SIGCHLD", "18: SIGCONT", "19: SIGSTOP", "20: SIGTSTP",

"21: SIGTTIN", "22: SIGTTOU", "23: SIGURG", "24: SIGXCPU",

"25: SIGXFSZ", "26: SIGVTALRM", "27: SIGPROF", "28: SIGWINCH",

"29: SIGIO", "30: SIGPWR", "31: SIGSYS", "34: SIGRTMIN",

"35: SIGRTMIN+1", "36: SIGRTMIN+2", "37: SIGRTMIN+3", "38: SIGRTMIN+4",

"39: SIGRTMIN+5", "40: SIGRTMIN+6", "41: SIGRTMIN+7", "42: SIGRTMIN+8",

"43: SIGRTMIN+9", "44: SIGRTMIN+10", "45: SIGRTMIN+11", "46: SIGRTMIN+12",

"47: SIGRTMIN+13", "48: SIGRTMIN+14", "49: SIGRTMIN+15", "50: SIGRTMAX-14",

"51: SIGRTMAX-13", "52: SIGRTMAX-12", "53: SIGRTMAX-11", "54: SIGRTMAX-10",

"55: SIGRTMAX-9", "56: SIGRTMAX-8", "57: SIGRTMAX-7", "58: SIGRTMAX-6",

"59: SIGRTMAX-5", "60: SIGRTMAX-4", "61: SIGRTMAX-3", "62: SIGRTMAX-2",

"63: SIGRTMAX-1", "64: SIGRTMAX" };

void *stack_p[10];

char **stack_info;

int size;

size = backtrace( stack_p, sizeof(stack_p));

stack_info = backtrace_symbols( stack_p, size);

if( no >= 1 && no <= 64)

printf("[%s] %d stack frames.\n", _signal[no-1], size);

else

printf("[No infomation %d] %d stack frames.\n", no, size);

int i = 0;

for( ; i 

printf("%s\n", stack_info[i]);

free( stack_info);

//free anything

fflush(NULL);

exit(0);

}

int fun_err()

{

char *p = 0x0 ;

*p = "a";

}

int main( int argc, char *argv[])

{

signal( SIGSEGV, fun_dump);

fun_err( );

}

其次,反汇编程序,生成dump

指令[objdump -d ./a.out >> dump]

然后,编译执行上面代码,报错如下:

BTC:/home/code/test # gcc -g main.c

BTC:/home/code/test # ./a.out

[11: SIGSEGV] 5 stack frames.

./a.out [0x804852d]

[0xffffe420]

./a.out [0x80485d6]

/lib/libc.so.6(__libc_start_main+0xdc) [0xb7e6587c]

./a.out [0x8048491]

其中最后一行的地址0x8048491就是出错代码的地址

最后,在dump文件中找到0x8048491对应的代码:

080485ac :

80485ac: 8d 4c 24 04 lea 0x4(%esp),%ecx

80485b0: 83 e4 f0 and $0xfffffff0,%esp

80485b3: ff 71 fc pushl 0xfffffffc(%ecx)

80485b6: 55 push %ebp

80485b7: 89 e5 mov %esp,%ebp

80485b9: 51 push %ecx

80485ba: 83 ec 14 sub $0x14,%esp

80485bd: c7 44 24 04 14 85 04 movl $0x8048514,0x4(%esp)

80485c4: 08

80485c5: c7 04 24 0b 00 00 00 movl $0xb,(%esp)

80485cc: e8 0f fe ff ff call 80483e0 

80485d1: e8 c1 ff ff ff call 8048597 

80485d6: 83 c4 14 add $0x14,%esp

3. 使用dmesg命令,查看系统信息,然后使用addr2line工具定位到行[addr2line -e test1 400506]

4. nodejs的pm2监控程序并自动重启

5.其它

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值