不能使用gdb在文件中创建断点

Cannot create a breakpoint in a file using gdb

本文关键字:创建 断点 文件 gdb 不能      更新时间:2023-10-16
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)

使用下列cflags编译:

CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0

我也试过只使用-g,但这也不起作用。

我有一个名为demo.cpp的文件,我正试图在该文件中创建一个断点。

我的可执行目标名为demo_app。我使用以下命令运行gdb:

gdb demo_app

尝试创建断点

b demo.cpp:997

gdb返回以下消息:

No source file named demo.cpp.
Make breakpoint pending on future shared library load? (y or [n]) n

可执行文件属性:

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

然而,我有另一个名为video.cpp的文件,我可以在该文件中创建断点。

非常感谢您的建议,

================== 更新我做了以下的事情:

(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

================= MAKEFILE ========

OBJECT_FILES = demo.o video.o
CFLAGS = -Wall -Wextra -Wunreachable-code -ggdb -O0 
CC = g++ -m32
TARGET = demo
# Include path
INC_PATH = -I /usr/network/inc
INC_PATH+= -I sdp/inc
# Library path
LIB_PATH = -L /usr/network/lib
LIB_PATH+= -L sdp/lib
# Libraries to include
LIBS = -lnetwork -lsdpAPI -lpthread
# Linker run-time path
LDFLAGS = -Wl,-rpath=/usr/network/lib
LDFLAGS+= -Wl,-rpath=sdp/lib
$(TARGET): $(OBJECT_FILES)
    $(CC) $(CFLAGS) $(LDFLAGS) $(INC_PATH) $(OBJECT_FILES) $(LIB_PATH) $(LIBS) -o $(TARGET)
demo.o: demo.cpp video.cpp
    $(CC) $(CLFAGS) $(INC_PATH) $(LIB_PATH) $(SDP_LIB) -c demo.cpp
video.o: video.cpp
    $(CC) $(CFLAGS) $(INC_PATH) $(LIB_PATH) -c video.cpp
clean:
    rm -f $(OBJECT_FILES) $(TARGET) *~

您的makefile中有一个错误- demo.o的配方中CLFAGS而不是CFLAGS .

如果你在运行make时观察输出,你应该能够捕捉到这个问题——当你只构建一个对象时,你会看到缺少编译器选项,因为CLFAGS是一个空变量。

当然,对于利用内置的食谱也有一些要说的。如果您将所有选项存储在默认情况下make期望的变量中,则不必重写配方,也不必有出现错别字的机会。例如,将$(INC_PATH)追加到CPPFLAGS后。(并且您不需要像现在这样将任何链接器标志传递给仅编译的步骤。)

有几种可能的解释:

  1. 最有可能的是那个演示。O(编译demo.cpp的结果)没有链接到最终的可执行文件中。如果你放demo,就会发生这种情况。进入一个档案库,和你的主。o不引用demo.o中的任何符号
  2. 你的演示。o真的不是用-ggdb标志构建的
  3. 你的GCC或GDB有一个bug

要确认或反驳1,请运行nm demo.o,然后运行nm demo_app,并验证demo中的符号。最后的可执行文件

要确认或反驳2,请运行make clean && make all > make.log 2>&1,然后查看实际上是什么命令行用于构建demo.o

如果你能反驳1和2,那么3是我目前能想到的唯一可能性。您可以使用readelf -w demo_app,看看它是否有对demo.cpp的引用。如果没有,则该错误存在于GCC中。如果存在,则该错误可能在GCC或GDB中。

编辑:感谢您提供的Makefile。您正在构建一个名为demo的可执行文件。您声称要调试demo_app。PEBKAC吗?

start作为您的第一个gdb命令。让程序加载。然后尝试设置断点。它应该不会提示您关于未来的库加载。假设断点设置为应有的值,则执行continue