不能使用gdb在文件中创建断点
Cannot create a breakpoint in a file using gdb
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
后。(并且您不需要像现在这样将任何链接器标志传递给仅编译的步骤。)
有几种可能的解释:
- 最有可能的是那个演示。O(编译demo.cpp的结果)没有链接到最终的可执行文件中。如果你放demo,就会发生这种情况。进入一个档案库,和你的主。o不引用demo.o中的任何符号
- 你的演示。o真的不是用
-ggdb
标志构建的 - 你的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
。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- GDB:在 C++ 中的类函数上创建一个断点
- 视觉对象C++创建动态数据断点
- 无法在 gdb 中创建断点
- 不能使用gdb在文件中创建断点