SegvHandler所做的就是打印出当前栈上STACK_BACK_SIZE个整数。根据这STACK_BACK_SIZE个整数,再反汇编binary代码,就可以确定coredump所产生的指令。
这是因为如果某条指令产生coredump,那么SegvHandler的返回地址就是该指令的下一条指令,当然实际在coredump发生时,系统可能会增加对libc.so中mutex_lock等的调用,再调用SegvHandle,栈空间是:
如果最终编译生成的binary文件是a.out,使用readelf或objdump将a.out反汇编,就可以知道栈空间上的对应内容,也就是SegFaultHandler中打印出的各值的含义,不外乎是返回地址,保存的寄存器值和局部变量等。
如果是在linux平台下,那么就不需要分析符号表,而可以调用backtrace来打出当前调用栈从而知道哪个函数导致coredump,但注意link时要加上 -rdynamic选项,否则符号表内容不清楚:
- #include <execinfo.h>
-
-
void print_trace()
-
{
-
void *array[40];
-
size_t size;
-
char **strings;
-
size_t i;
-
-
size = backtrace (array, 40);
-
strings = backtrace_symbols (array, size);
-
-
for (i = 0; i < size; i++)
-
{
-
printf("##callstack##%s\n", strings[i]);
-
-
}
-
printf("\n");
-
free (strings);
-
-
}
void SegFaultHandler(int signo)
{
int trace;
print_trace();
exit(signo);
}
void main()
{
signal(SIGSEGV, SegFaultHandler);
... ...
}