简体   繁体   English

回溯结果未显示崩溃位置

[英]backtrace results did not reveal crash location

I am trying to use backtrace and backtrace_symbols results to print out where my code crash after I have captured a SIGSEGV signal. 我试图使用backtrace和backtrace_symbols结果打印出捕获SIGSEGV信号后代码崩溃的位置。 I explicitly triggered that from a worker thread. 我是通过工作线程明确触发的。 I compiled my static linked multi-thread c++ program with option -rdynamic, and I was expecting backtrace_symbols would return a stack trace to tell me where the crash happened, but the below result wasn't what i was expecting, MyApplicationService is not a method, but just the executable name, and I don't understand why. 我用选项-rdynamic编译了静态链接多线程c ++程序,我期望backtrace_symbols将返回堆栈跟踪以告诉我崩溃发生的位置,但是以下结果不是我所期望的,MyApplicationService不是一种方法,但只是可执行文件的名称,我不明白为什么。

    2013-03-07 15:13:18.119986598 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZNK5boost4_mfi3mf2IvN18my_app__service_lib14service_runnerERKNS_6system10error_codeEiEclEPS3_S7_i+0x74) [0xcd69fa]
    2013-03-07 15:13:18.119988126 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost3_bi5list3INS0_5valueIPN18my_app__service_lib14service_runnerEEENS_3argILi1EEENS7_ILi2EEEEclINS_4_mfi3mf2IvS4_RKNS_6system10error_codeEiEENS0_5list2ISH_RKiEEEEvNS0_4typeIvEERT_RT0_i+0x7c) [0xcd6848]
    2013-03-07 15:13:18.119989192 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost3_bi6bind_tIvNS_4_mfi3mf2IvN18my_app__service_lib14service_runnerERKNS_6system10error_codeEiEENS0_5list3INS0_5valueIPS5_EENS_3argILi1EEENSF_ILi2EEEEEEclIS7_iEEvRKT_RKT0_+0x4c) [0xcd6690]
    2013-03-07 15:13:18.119990120 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost4asio6detail7binder2INS_3_bi6bind_tIvNS_4_mfi3mf2IvN18my_app__service_lib14service_runnerERKNS_6system10error_codeEiEENS3_5list3INS3_5valueIPS8_EENS_3argILi1EEENSI_ILi2EEEEEEESA_iEclEv+0x2b) [0xcd6597]
    2013-03-07 15:13:18.119991031 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost4asio19asio_handler_invokeINS0_6detail7binder2INS_3_bi6bind_tIvNS_4_mfi3mf2IvN18my_app__service_lib14service_runnerERKNS_6system10error_codeEiEENS4_5list3INS4_5valueIPS9_EENS_3argILi1EEENSJ_ILi2EEEEEEESB_iEEEEvT_z+0x62) [0xcd64b0]
    2013-03-07 15:13:18.119992105 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN33boost_asio_handler_invoke_helpers6invokeIN5boost4asio6detail7binder2INS1_3_bi6bind_tIvNS1_4_mfi3mf2IvN18my_app__service_lib14service_runnerERKNS1_6system10error_codeEiEENS5_5list3INS5_5valueIPSA_EENS1_3argILi1EEENSK_ILi2EEEEEEESC_iEESO_EEvRT_RT0_+0x64) [0xcd636c]
    2013-03-07 15:13:18.119993000 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost4asio6detail14signal_handlerINS_3_bi6bind_tIvNS_4_mfi3mf2IvN18my_app__service_lib14service_runnerERKNS_6system10error_codeEiEENS3_5list3INS3_5valueIPS8_EENS_3argILi1EEENSI_ILi2EEEEEEEE11do_completeEPNS1_15task_io_serviceEPNS1_25task_io_service_operationESC_m+0xb9) [0xcd605d]
    2013-03-07 15:13:18.119993884 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost4asio6detail25task_io_service_operation8completeERNS1_15task_io_serviceERKNS_6system10error_codeEm+0x32) [0xccceac]
    2013-03-07 15:13:18.119994819 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost4asio6detail15task_io_service10do_run_oneERNS1_11scoped_lockINS1_11posix_mutexEEERNS2_11thread_infoERKNS_6system10error_codeE+0x1a1) [0xccf4a5]
    2013-03-07 15:13:18.119995795 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost4asio6detail15task_io_service3runERNS_6system10error_codeE+0x137) [0xcceffd]
    2013-03-07 15:13:18.119996845 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN5boost4asio10io_service3runEv+0x2f) [0xccf823]
    2013-03-07 15:13:18.119997845 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(_ZN18my_app__service_lib14service_runner3runEv+0x97) [0xccbb65]
    2013-03-07 15:13:18.119998914 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService(main+0x4cc) [0xcc4608]
    2013-03-07 15:13:18.119999767 [7f2279bbe720] INFO  service_runner - /lib64/libc.so.6(__libc_start_main+0xfd) [0x3f0f01ecdd]
    2013-03-07 15:13:18.120000694 [7f2279bbe720] INFO  service_runner - ../Debug/MyApplicationService() [0xcc4059]

This is the code i used to print the above results: 这是我用来打印以上结果的代码:

          void *trace[16];
          char **messages = (char **)NULL;
          int i, trace_size = 0;
          SERVICE_LOG_INFO << "Receive signal " << sig ;    
          trace_size = backtrace(trace, 16);
          messages = backtrace_symbols(trace, trace_size);
          LOG << "[bt] Execution path:" ;
          for (i=1; i<trace_size; ++i)
              LOG << messages[i];

Additional Information: 附加信息:

    OS: RHEL 6.3
    compiler: gcc 4.4.6
    compile option: -I/opt/rh/devtoolset-1.0/root/usr/include -I/opt/rh/devtoolset-1.0/root/usr/include/c++/4.7.0 -I/opt/rh/devtoolset-1.0/root/usr/include/c++/4.7.0/backward -I/opt/rh/devtoolset-1.0/root/usr/include/c++/4.7.0/x86_64-redhat-linux -I/opt/rh/devtoolset-1.0/root/usr/lib/gcc/x86_64-redhat-linux/4.7.0/include -I/opt/boost_1_52_0 -I/opt/tbb41_20121003oss/include -I/opt/libev-4.11/include -I"Myapp/include" -O0 -g3 -rdynamic -Wall -c -fmessage-length=0 -std=c++11 -fno-strict-aliasing -MMD -MP -MF"src/service_runner.d" -MT"src/service_runner.d" -o "src/service_runner.o" "../src/service_runner.cpp"

Compile options show -c , so -rdynamic is passed to the compile step. 编译选项show -c ,因此-rdynamic被传递到编译步骤。 You need to make sure it's used when linking the code. 您需要确保在链接代码时使用了它。 Check that this is the case. 检查是否是这种情况。

EDIT: Bryan, you now added the mangled symbols to the question, so effectively you want to ask a different question now. 编辑:布莱恩,您现在向问题中添加了乱码,因此您现在想有效地提出另一个问题。 Please don't do that. 请不要那样做。

But since you did: You need to parse each line from backtrace_symbols to extract the mangled symbol and call __cxa_demangle on it. 但是,既然这样做了:您需要从backtrace_symbols解析每一行以提取损坏的符号并在其上调用__cxa_demangle The strategy is to search for the + from the end of the string, then search for the opening bracket ( , again backwards from the + . The reason for the backwards-searching is, that the filename in the front may also contain these characters (unlikely, but possible). If you try to implement it and you run into problems, please open a new question . 该策略是从字符串末尾搜索+ ,然后搜索左括号( ,再次从+向后搜索。向后搜索的原因是,文件名前面也可能包含这些字符(不太可能,但有可能)。如果您尝试实施它并遇到问题, 请打开一个新问题

Finally got everything sorted out. 终于把一切整理好了。

Solution steps: 1) add -rdynamic in the linker option. 解决方案步骤:1)在链接器选项中添加-rdynamic。

2) use this code to demangle the mangled string: (code is from this thread ) 2)使用此代码来分解损坏的字符串:(代码来自此线程

            // skip first stack frame (points here)
            for (int i = 0; i < trace_size && messages != NULL; ++i)
            {
                char *mangled_name = 0, *offset_begin = 0, *offset_end = 0;

                // find parantheses and +address offset surrounding mangled name
                for (char *p = messages[i]; *p; ++p)
                {
                    if (*p == '(')
                    {
                        mangled_name = p;
                    }
                    else if (*p == '+')
                    {
                        offset_begin = p;
                    }
                    else if (*p == ')')
                    {
                        offset_end = p;
                        break;
                    }
                }

                // if the line could be processed, attempt to demangle the symbol
                if (mangled_name && offset_begin && offset_end &&
                    mangled_name < offset_begin)
                {
                    *mangled_name++ = '\0';
                    *offset_begin++ = '\0';
                    *offset_end++ = '\0';

                    int status;
                    char * real_name = abi::__cxa_demangle(mangled_name, 0, 0, &status);

                    // if demangling is successful, output the demangled function name
                    if (status == 0)
                    {
                        std::cerr << "[bt]: (" << i << ") " << messages[i] << " : "
                                  << real_name << "+" << offset_begin << offset_end
                                  << std::endl;

                    }
                    // otherwise, output the mangled function name
                    else
                    {
                        std::cerr << "[bt]: (" << i << ") " << messages[i] << " : "
                                  << mangled_name << "+" << offset_begin << offset_end
                                  << std::endl;
                    }
                    free(real_name);
                }
                // otherwise, print the whole line
                else
                {
                    std::cerr << "[bt]: (" << i << ") " << messages[i] << std::endl;
                }
            }
            std::cerr << std::endl;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM