我使用这个启动gdb(工作目录是/ home / leon / Develop / tests / atomic /):
gdb ./bin/lin64/httpress
然后我添加了包含源文件的目录,它理解我:
Source directories searched: /home/leon/Develop/tests/atomic/third/http_parser:/home/leon/Develop/tests/atomic/src/tools:$cdir:$cwd
当我运行我的二进制文件时,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
好的,我做了一些改变:
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
在这种情况下,它仍然无法在二进制文件中找到符号。 但是,如果我从gcc调用中删除-s选项。它写道:
Reading symbols from /home/leon/Develop/tests/atomic/bin/lin64/httpress...done.
但是调试器仍然这样说:
(gdb) info source
No current source file.
...在我用源代码指向他的目录之后。
答案 0 :(得分:6)
您错过-g
电话中的gcc
以包含调试信息。
另一方面,我建议将优化级别从-O2
降低到-O0
并仅使用一次(包括gcc
调用有2 -O2
)。
除此之外,您可以使用dir
命令将目录添加到gdb的源路径:Source_Path。但是,只有在httpress
答案 1 :(得分:2)
删除优化标记:
-O2
并添加标志:
-g -ggdb
答案 2 :(得分:2)
但是调试器仍然这样说:
(gdb)信息来源
没有当前的源文件 ...在我用源代码指向他的目录之后。
这是预期。由于您尚未开始执行二进制文件,因此没有当前来源。
您想要start
或run
您的二进制文件并将其带到执行中的某个位置(例如main
或崩溃点)。