backtrace_symbols / backtrace_symbols_fd即使在-rdynamic

时间:2019-07-03 06:26:28

标签: ubuntu gcc backtrace

我在C上有一个小程序,可以在ubuntu下使用GCC版本7.4.0进行编译(Ubuntu / Linaro 7.4.0-1ubuntu1〜18.04.1) 我希望能够看到引起分段错误的特定行(或函数名称)。

这是我的编译脚本:

rm -rf ./server.bin
gcc -w -c ./*.c witfy/common/list.c witfy/common/data.c witfy/common/aes.c witfy/common/sts_queue.c -fpack-struct=2 -fpermissive -I/usr/include/mysql
gcc -o server.bin ./*.o -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl -rdynamic
rm -rf ./*.o

然后,在代码中,我使用https://linux.die.net/man/3/backtrace_symbols中的示例:

static void handle_signal(int signal) {
    if (signal == SIGSEGV) {
        void *array[100];
        char **strings;
        size_t size = backtrace(array, 100);        
        //backtrace_symbols_fd(array, size, STDERR_FILENO);
        strings = backtrace_symbols(array, size);
        if (strings == NULL) {
            perror("backtrace_symbols");
            exit(EXIT_FAILURE);
        }
        for (int j = 0; j < size; j++) printf("%s\n", strings[j]);
        fflush(stdout);
        exit(1);        
    }    
}


int main(int argc, char** argv) {

    new_action.sa_handler = handle_signal;
    sigemptyset (&new_action.sa_mask);
    new_action.sa_flags = 0;
    sigaction (SIGSEGV, &new_action, NULL); 


    ...


}

我得到的唯一输出是:     [0x11a68b4ac]

顺便说一句,我发现我可能需要addr2line,但它也没有提供任何信息:

addr2line -i -C -f -p -e ./server.bin 0x11a68b4ac
?? ??:0

如何获取有关线路/功能名称的信息?

0 个答案:

没有答案