C++无法解码回溯
C++ cannot decode backtrace
我已经使用在脚本上设置了backstrace_symbols
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);
}
在主函数中,它被称为使用
signal(SIGSEGV, handler);
回溯:
11
/opt/scripts/cplusconnector(_Z7handleri+0x2b) [0x40233b]
/lib64/libc.so.6(+0x32920) [0x7fe7b503c920]
/lib64/libc.so.6(+0x131b5f) [0x7fe7b513bb5f]
/opt/scripts/cplusconnector(main+0x163) [0x4035c3]
/lib64/libc.so.6(__libc_start_main+0xfd) [0x7fe7b5028cdd]
/opt/scripts/cplusconnector() [0x402199]
11
/opt/scripts/cplusconnector(_Z7handleri+0x2b) [0x40233b]
/lib64/libc.so.6(+0x32920) [0x7fd9db71a920]
/lib64/libc.so.6(+0x131b5f) [0x7fd9db819b5f]
/opt/scripts/cplusconnector(main+0x163) [0x4035c3]
/lib64/libc.so.6(__libc_start_main+0xfd) [0x7fd9db706cdd]
/opt/scripts/cplusconnector() [0x402199]
[root@server dev]# addr2line -e test-unstrippped 0x402199 0x7f1999f16cdd 0x4035c3
??:0
??:0
/usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/basic_string.h:975
问题可能在哪里?为什么运行程序会导致分段故障?
更新:
它是使用这些选项编译的
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;
}
有什么想法吗??
我认为确实有充分的理由使用free()
对于名称篡改,请使用abi::__cxa_demangle。
要调试程序,可以启用核心转储(使用setrlimit(2)系统调用,通常通过ulimit bash内置)。然后,使用程序和核心转储运行gdb
。
至于backtrace_symbols
为什么给你起这样的名字,那是因为名字篡改。另请参见此。
还可以考虑使用Ian Taylor的libbacktrace(集成到GCC的最新版本中,例如GCC 6及以上版本)。使用-g
(也许还有一些优化标志,如-O
)
backtrace()。
有一个(简短的)方法列表,可以从信号处理程序中调用。我现在太懒了,太谷歌了,尽管
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 回溯C++不打印函数,因此文件
- 无法解码base64+deflate数据
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 使用已使用 java 编码的 openssl 解码数据
- 如何使用 OpenCV 解码在两个 UWP 应用之间发送的图像字节?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 从原始字节解码协议缓冲区(以 C++为单位)
- FFmpeg——使用硬件加速进行视频解码
- 如何从WIC解码器确定自上而下/自下而上?
- 如何解释GDB中回溯的模板函数签名?
- 使用公钥加密消息:BER 解码错误
- 在CRC-16 CCITT中将数据从二进制解码为文本,我应该输入一个码字,使用CRC生成器进行编码
- 在 GLFW 窗口中显示 FFMPEG 解码帧
- 如何将 MJPEG 解码为原始 RGB(或 YUV)数据
- 重新引发异常保留回溯
- 编译时 Base64 解码 C++
- 解码H264流时如何跳过帧?
- C++无法解码回溯