fun*_*lic 12 c++ gdb segmentation-fault
我正在使用gdbserver从嵌入式设备进行调试:
./gdbserver HOST:5000 /home/test_app
Run Code Online (Sandbox Code Playgroud)
在我的电脑中,我以这种方式执行gdb:
arm-none-linux-gnueabi-gdb test_app
Run Code Online (Sandbox Code Playgroud)
一旦应用程序执行,我收到我想要调试的Segfault,但是不可能知道它产生了什么行:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 715]
0x31303030 in ?? ()
(gdb) bt
#0 0x31303030 in ?? ()
#1 0x0000dff8 in ?? ()
#2 0x0000dff8 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
Run Code Online (Sandbox Code Playgroud)
(我必须说我是GDB的新手)
Kam*_*ath 15
好的,如果缺少调试符号,通常会发生这种情况......只是为了确保运行以下命令
file <your_executable>
Run Code Online (Sandbox Code Playgroud)
你将获得关于你的二进制文件的信息,如格式,arch等.信息的最后部分描述二进制文件是否被剥离.对于GDB中的调试,二进制文件不应该被剥离.
nm --debug-sym <your_executable> | grep debug
Run Code Online (Sandbox Code Playgroud)
如果您有一些有效的打印件,则表示存在调试符号.
00000000 N .debug_abbrev
00000000 N .debug_aranges
00000000 N .debug_frame
00000000 N .debug_info
00000000 N .debug_line
00000000 N .debug_loc
00000000 N .debug_pubnames
00000000 N .debug_str
Run Code Online (Sandbox Code Playgroud)
此外,当您调用GDB时,您应该使用以下行
Reading symbols from <your_executable>...done.
Run Code Online (Sandbox Code Playgroud)
此时,您应该能够使用list命令列出源.
确保gdb和gdbserver都具有相同的versioninig.
arm-none-linux-gnueabi-gdb --version
./gdbserver --version
Run Code Online (Sandbox Code Playgroud)
如果以上所有都是真的,并且你仍然没有得到回溯,你的堆栈会发生一些不好的事情.尝试运行一些静态分析,valgrind代码/新添加的代码.