C++ 无法使用gdb在文件中创建断点

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

使用以下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 -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命令。让程序加载。然后尝试设置断点。这样,它就不会提示您将来加载库。假设断点设置为应设置的值,然后继续执行
操作

有几种可能的解释:

  • 最可能的情况是demo.o(编译demo.cpp的结果)没有链接到最终的可执行文件中。如果您将demo.o放入存档库,并且主.o未引用demo.o中的任何符号,则可能会发生这种情况
  • 您的demo.o实际上不是使用
    -ggdb
    标志构建的
  • 您的GCC或GDB中存在错误
  • 要确认或反驳1,请运行
    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?

    有几种可能的解释:

  • 最可能的情况是demo.o(编译demo.cpp的结果)没有链接到最终的可执行文件中。如果您将demo.o放入存档库,并且主.o未引用demo.o中的任何符号,则可能会发生这种情况
  • 您的demo.o实际上不是使用
    -ggdb
    标志构建的
  • 您的GCC或GDB中存在错误
  • 要确认或反驳1,请运行
    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