C++无法解码回溯
我已使用以下方法在脚本上设置backstrace_符号: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
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;
}