Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++无法解码回溯_C++_Linux_Centos - Fatal编程技术网

C++无法解码回溯

C++无法解码回溯,c++,linux,centos,C++,Linux,Centos,我已使用以下方法在脚本上设置backstrace_符号: void handler(int sig) { void *array[20]; size_t size; char **strings; size_t i; size = backtrace(array, 20); strings = backtrace_symbols(array,size); tracelog.open("/var/log/safesquid/safesq

我已使用以下方法在脚本上设置backstrace_符号:

void handler(int sig) {
    void *array[20];
    size_t size;
    char **strings;
    size_t  i;

    size = backtrace(array, 20);
    strings = backtrace_symbols(array,size);

    tracelog.open("/var/log/safesquid/safesquid/debug/trace.log", ios::app);
    tracelog << sig << endl;
    for (i=0; i<size; i++)
        tracelog << strings[i] << endl;

    free(strings);

    exit(1);
}
回溯:

问题出在哪里?为什么运行程序会导致错误

更新:

它是使用这些选项编译的

g++ cplusconnector-k.cpp -g -rdynamic -O2 -I/usr/include/mysql -L/usr/lib/mysql -lmysqlcppconn -o test  `mysql_config --cflags --libs`
更新:

我删除了优化,并尝试使用回溯中的add2line解析符号,它指向代码中的这一行

/opt/webcache/scripts/cplusconnector(_Z7handleri+0x25) [0x401d49]
/lib64/libc.so.6(+0x32920) [0x7f6ad974b920]
/lib64/libc.so.6(+0x131b5f) [0x7f6ad984ab5f]
/usr/lib64/libstdc++.so.6(_ZNSsaSEPKc+0x1c) [0x7f6ad9dcd12c]
/opt/webcache/scripts/cplusconnector(main+0x12b) [0x4027ae]
/lib64/libc.so.6(__libc_start_main+0xfd) [0x7f6ad9737cdd]
/opt/webcache/scripts/cplusconnector() [0x401c69]


[root@server dev]# addr2line -e test 0x401d49 0x7f6ad974b920 0x7f6ad984ab5f 0x7f6ad9dcd12c 0x4027ae 0x7f6ad9737cdd 0x401c69
/usr/local/dev/cplusconnector-k.cpp:42
??:0
??:0
??:0
/usr/local/dev/cplusconnector-k.cpp:138
??:0
??:0
第42行在主功能之外,是全局的:

ofstream httplog;
第138行位于主功能内:

    if (std::string::npos != host.find(string("1.0.0.1"))){
          return 0;
       }

任何想法???

要调试程序,可以使用系统调用启用转储,通常通过bash内置。然后,使用程序和核心转储运行gdb

至于为什么回溯符号给你这样的名字,那是因为。另见


还可以考虑将Ian Taylor的方法集成到GCC的最新版本中,例如GCC 6及以上版本。使用-g编译代码,也许还可以使用一些优化标志,如-O来调试程序,您可以使用系统调用(通常通过bash内置)启用转储。然后,使用程序和核心转储运行gdb

至于为什么回溯符号给你这样的名字,那是因为。另见


还可以考虑将Ian Taylor的方法集成到GCC的最新版本中,例如GCC 6及以上版本。使用-g编译您的代码,也许还可以使用一些优化标志,比如-O

我发现使用free确实有很好的理由


对于名称mangling,请使用。

我认为使用免费的确实是一个很好的理由


对于名称mangling,请使用。

不能从信号处理程序调用backtrace

有一个可以从信号处理程序调用的方法的简短列表。
我现在太懒了,谷歌也做不到,尽管不能从信号处理程序调用回溯

有一个可以从信号处理程序调用的方法的简短列表。
我现在太懒了,谷歌也不适合它,尽管

如果你用调试符号构建,给GCC-g命令行选项,那么你应该在回溯中看到文件名和行号。这将告诉您哪一行main调用了正在崩溃的库函数。在调试器(如gdb)下运行代码,或启用内核转储ulimit-c unlimited并在调试器gdb my_程序core中检查结果,可能会提供更多信息,例如当时变量的值。我尝试过gdb,并使用-g标志编译了它,当从命令行运行时,应用程序不会给出segfault。而且gdb是干净的,只有当代理运行此脚本时,才会给出segfault…@kridigitx:另外,请确保正在调试的程序是在没有优化的情况下编译的-O0,否则,函数内联和其他代码转换可能会使回溯变得毫无帮助。如果使用调试符号进行构建,并为GCC提供-g命令行选项,则应在回溯中看到文件名和行号。这将告诉您哪一行main调用了正在崩溃的库函数。在调试器(如gdb)下运行代码,或启用内核转储ulimit-c unlimited并在调试器gdb my_程序core中检查结果,可能会提供更多信息,例如当时变量的值。我尝试过gdb,并使用-g标志编译了它,当从命令行运行时,应用程序不会给出segfault。而且gdb是干净的,只有当代理运行此脚本时,才会给出segfault…@kridigitx:另外,请确保正在调试的程序是在没有优化的情况下编译的-O0,否则,函数内联和其他代码转换可能会使回溯变得毫无用处。回溯_符号返回malloced数组,因此在这里使用free是正确的。@MikeSeymour是的,我重犯我的错误几秒钟太晚了,它似乎msbacktrace_符号返回malloced数组,所以在这里使用free是正确的。@MikeSeymour是的,我重犯了我的错误,时间太晚了几秒钟。我似乎已经尝试了gdb,并且还使用-g标志编译了它,应用程序在从命令行运行时不提供segfault。而且gdb是干净的,只有当代理运行此脚本时,才会提供segfault…我尝试了gdb,并且还使用-g标志对其进行编译,当从命令行运行时,应用程序不会给出segfault..并且gdb是干净的,只有当代理运行此脚本时,才会给出segfault。。。
ofstream httplog;
    if (std::string::npos != host.find(string("1.0.0.1"))){
          return 0;
       }