Leo*_*nid 6 c debugging gcc gdb
我使用这个启动gdb(工作目录是/ home/leon/Develop/tests/atomic /):
gdb ./bin/lin64/httpress
Run Code Online (Sandbox Code Playgroud)
然后我添加了源文件的目录,它理解我:
Source directories searched: /home/leon/Develop/tests/atomic/third/http_parser:/home/leon/Develop/tests/atomic/src/tools:$cdir:$cwd
Run Code Online (Sandbox Code Playgroud)
当我运行我的二进制文件时,gdb无法识别我的源代码中发生segfault的行.如何设置gdb的源文件?
该程序由gcc编译:
gcc -D_AMD64_ -D_LIN_ -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -m64 -march=core2 -O2 -Wall -I. -I src/include -I src/lib/zlib/ -I src/lib/otg -I third/openssl/include/ -I src/lib/otg/Tools/HostTime/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Cross -I src/lib/otg/Tools/OpenToolsGate/Common/Interfaces/ -o bin/lin64/httpress -std=c99 -lpthread -lev -lgnutls -O2 -s -DWITH_SSL -Wno-strict-aliasing \
-I /usr/include/libev src/tools/httpress.c -I third/http_parser/ third/http_parser/http_parser.c
Run Code Online (Sandbox Code Playgroud)
好的,我做了一些改变:
gcc -g -ggdb -D_AMD64_ -D_LIN_ -D_LARGEFILE64_SOURCE -D_GNU_SOURCE -m64 -march=core2 -Wall -I. -I src/include -I src/lib/zlib/ -I src/lib/otg -I third/openssl/include/ -I src/lib/otg/Tools/HostTime/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Interfaces/ -I src/lib/otg/Tools/OpenToolsGate/Guest/Cross -I src/lib/otg/Tools/OpenToolsGate/Common/Interfaces/ -o bin/lin64/httpress -std=c99 -lpthread -lev -lgnutls -s -DWITH_SSL -Wno-strict-aliasing \
-I /usr/include/libev src/tools/httpress.c -I third/http_parser/ third/http_parser/http_parser.c
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它仍然无法在二进制文件中找到符号.但是,如果我从gcc调用中删除-s选项.它写道:
Reading symbols from /home/leon/Develop/tests/atomic/bin/lin64/httpress...done.
Run Code Online (Sandbox Code Playgroud)
但调试器仍然这样说:
(gdb) info source
No current source file.
Run Code Online (Sandbox Code Playgroud)
...在我用源代码指向他的目录之后.
你错过了-g
你的gcc
电话,包括调试信息.
另一方面,我建议将优化级别降低-O2
到-O0
仅使用一次(包括gcc
调用有2 -O2
).
除此之外,您可以使用以下dir
命令将目录添加到gdb的源路径:Source_Path.但这只有在你有适当的调试信息时才有效httpress