C++ 无法使用gdb在文件中创建断点
使用以下CFLAG进行编译:C++ 无法使用gdb在文件中创建断点,c++,gdb,g++,C++,Gdb,G++,使用以下CFLAG进行编译: gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-32.el5_6.2) g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50) 我也尝试过只使用-g,但也不起作用 我有一个文件调用demo.cpp,我正试图在该文件中创建一个断点 我的可执行目标称为demo_app。我使用以下命令运行gdb: CFLAGS = -Wall -Wextra -Wunreachable-code -gg
gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-32.el5_6.2)
g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)
我也尝试过只使用-g
,但也不起作用
我有一个文件调用demo.cpp
,我正试图在该文件中创建一个断点
我的可执行目标称为demo_app。我使用以下命令运行gdb:
CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
我尝试创建断点
gdb demo_app
gdb返回以下消息:
b demo.cpp:997
可执行文件属性:
No source file named demo.cpp.
Make breakpoint pending on future shared library load? (y or [n]) n
但是,我有另一个名为video.cpp
的文件,我可以在该文件中创建断点
非常感谢你的建议
=========================更新
我已经做了以下工作:
CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0
ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
=========================生成文件========
(gdb) start
Temporary breakpoint 1 at 0x804ba44
Starting program: /home/user/video_demo/demo
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address
warning: difference appears to be caused by prelink, adjusting expectations
warning: .dynamic section for "/lib/libuuid.so.1" is not at the expected address
warning: difference appears to be caused by prelink, adjusting expectations
[Thread debugging using libthread_db enabled]
[New Thread 0x1ab7b90 (LWP 5123)]
(gdb) b demo.cpp:1038
No source file named demo.cpp.
Make breakpoint pending on future shared library load? (y or [n]) n
说
start
作为您的第一个gdb命令。让程序加载。然后尝试设置断点。这样,它就不会提示您将来加载库。假设断点设置为应该设置的值,然后执行continue
将start
作为第一个gdb命令。让程序加载。然后尝试设置断点。这样,它就不会提示您将来加载库。假设断点设置为应设置的值,然后继续执行操作
有几种可能的解释:
-ggdb
标志构建的nm demo.o
,然后运行nm demo\u app
,并验证demo.o中的符号是否存在于最终可执行文件中
要确认或反驳2,请运行makeclean&&makeall>make.log 2>&1
,然后查看实际用于构建demo.o的命令行
如果你能反驳1和2,那么3是我目前唯一能想到的可能性。您可以使用readelf-w demo_app
,查看它是否引用了demo.cpp
。如果没有,则错误在GCC中。如果是的话,这个bug可能在GCC或GDB中
编辑:感谢您提供Makefile。您正在构建一个名为
demo
的可执行文件。您声称调试demo\u应用程序
。PEBKAC?有几种可能的解释:
-ggdb
标志构建的nm demo.o
,然后运行nm demo\u app
,并验证demo.o中的符号是否存在于最终可执行文件中
要确认或反驳2,请运行makeclean&&makeall>make.log 2>&1
,然后查看实际用于构建demo.o的命令行
如果你能反驳1和2,那么3是我目前唯一能想到的可能性。您可以使用readelf-w demo_app
,查看它是否引用了demo.cpp
。如果没有,则错误在GCC中。如果是的话,这个bug可能在GCC或GDB中
编辑:感谢您提供Makefile。您正在构建一个名为
demo
的可执行文件。您声称调试demo\u应用程序
。PEBKAC?您的制作文件中有一个错误-CLFAGS
而不是demo.o配方中的CFLAGS
如果在运行make时观察输出,您应该能够捕捉到这一点,因为CLFAGS
是一个空变量,因此在构建一个对象时,您将看到缺少的编译器选项
当然,对于如何利用内置的配方,也有一些值得一提的地方。如果默认情况下将所有选项都存储在变量make expects中,那么就不必重写配方,也不会出现打字错误。例如,将
$(INC_PATH)
附加到CPPFLAGS
。(你不需要传递任何链接器标志来编译你正在做的步骤。)你的makefile中有一个错误-CLFAGS
,而不是demo.o配方中的CFLAGS
如果在运行make时观察输出,您应该能够捕捉到这一点,因为CLFAGS
是一个空变量,因此在构建一个对象时,您将看到缺少的编译器选项
当然,对于如何利用内置的配方,也有一些值得一提的地方。如果默认情况下将所有选项都存储在变量make expects中,那么就不必重写配方,也不会出现打字错误。例如,将
$(INC_PATH)
附加到CPPFLAGS
。(您不需要传递任何链接器标志,就可以像现在这样只编译步骤。)您好,我按照您的要求做了。但是,只要我选择开始,然后尝试设置断点,我就会收到相同的消息。我已经用新的输出更新了我的问题。谢谢。你能告诉我们你正在使用的编译和链接命令吗?你好,约翰,我已经在我的问题中添加了完整的Makefile以及所有的编译和链接。谢谢。你好,我照你说的做了。但是,只要我选择开始,然后尝试设置断点,我就会收到相同的消息。我已经用新的输出更新了我的问题。谢谢。你能告诉我们你正在使用的编译和链接命令吗?你好,约翰,我已经在我的问题中添加了完整的Makefile以及所有的编译和链接。谢谢。对不起,这只是demo_应用程序的一个类型错误。我正在用另一个应用程序进行测试。谢谢。您仍然应该使用我给出的步骤来反驳1和2(考虑到您的Makefile,我看不出这两个步骤是如何正确的)。然后使用readelf确认调试信息实际上包含dem