EsrCreate时遇到段错误导致程序崩溃
signal(SIGSEGV, signal_handler);
void sig_function(int sig)
{
void *array[100];
size_t size;
char **strframe ;
size_t i;
if(sig == SIGSEGV)
{
EDEBUG(0, "get illegal instruction or segmation fault: %d\n", sig);
size = backtrace (array, 100);
EDEBUG(0, "backtrace() returned %d addresses\n", size);
strframe= backtrace_symbols (array, size);
if(strframe==NULL)
{
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for(i = 0; i < size; i++)
{
EDEBUG(0, "frame [%02d] -- %s\n", i, strframe[i]);
}
}
free(strframe);
signal(sig, SIG_DFL);
raise(sig);
}
通过以上程序代码打印程序运行轨迹和崩溃地址
将源代码目录的c文件编译生产.o文件
powerpc-none-linux-gnuspe-c++ -g --rdynamic -c main.cpp
使用一下命令连接生成带debug信息的可执行文件
powerpc-none-linux-gnuspe-c++ -o demo m_pthread.o main.o aitalk.o -lpthread -lstdc++ -ldl ./Aitalk/Lib/Aitalk5.a ./gbuni/gbuni.a
使用以下命令反汇编生产汇编文件
powerpc-none-linux-gnuspe-objdump -S -D -t demo >test.txt
然后根据以下程序语音打印地址在汇编文件中查找程序崩溃位置和函数进行调试
=========>>>catch signal 11 <<<=========
Dump stack start...
backtrace() returned 11 addresses
[00] ./demo [0x10002b88]
[01] ./demo [0x10002e60]
[02] [0x100344]
[03] ./demo [0x100d3a08]
[04] ./demo [0x1000c960]
[05] ./demo [0x10006658]
[06] ./demo [0x100049fc]
[07] ./demo [0x10004d2c]
[08] ./demo [0x10002a90]
[09] /lib/libc.so.6 [0xfbbfd18]
[10] /lib/libc.so.6 [0xfbbfe34]
Dump stack end...
Segmentation fault
[user@P10xxCPB home]$