首先,我想指出我没有C编程背景,所以更详细的答案将对我有所帮助。我从here下载了一个C mp3解码器项目,我需要对其进行调试,以便了解mp3压缩算法的一些步骤。
我从不同的教程中学习了GDB的基础知识,所以我开始使用包含的Makefile编译项目,然后我为这个编译输出运行GDB:
gdb --args mp3decode test.mp3
但是当我试图列出文件来设置断点时,我得到了这个:
(gdb) list
init.c:1: No such file or directory.
搜索上面输出的一点点,编译时更常见的错误是没有使用 -g 选项,但是我确保选项在Makefile中。
CFLAGS = -g -O4 -funroll-loops -Wall -ansi -DOUTPUT_SOUND
OBJS = MP3_Bitstream.o MP3_Decoder.o MP3_Huffman.o MP3_Huffman_Table.o \
MP3_Main.o MP3_Synth_Table.o main.o remote_control.o audio.o debug.o
然后:
mp3decode: $(OBJS)
$(CC) $(CFLAGS) -o mp3decode $(OBJS) -lm
我想要实现的是在main.c文件的第46行设置一个断点,然后在同一行上进入 MPG_Get_Filepos()方法,但是没有列出main.c在GDB控制台中。
我认为问题出在编译命令中,因为为所有文件创建了一个C对象(不知道我是不是错了),这就是我无法调试代码的原因。
如何在这样的项目中逐步调试?感谢您的帮助。
更新
这是我用来编译程序的命令:
gcc -g -funroll-loops -Wall -ansi -DOUTPUT_SOUND -o mp3decode MP3_Bitstream.o MP3_Decoder.o MP3_Huffman.o MP3_Huffman_Table.o MP3_Main.o MP3_Synth_Table.o main.o remote_control.o audio.o debug.o -lm
然后我使用Gui和tui来调试它:
$ gdb -tui --args mp3decode test2.mp3
(gdb) br main
Breakpoint 1 at 0x804ea2e
(gdb) run
Starting program: /home/jorge/Documents/mp3decoder/mp3decode test2.mp3
Breakpoint 1, 0x0804ea2e in main ()
(gdb) list
init.c:1: No such file or directory.
答案 0 :(得分:2)
问题是我没有删除所有二进制文件,特别是C共享对象。删除所有使用 -g 选项重新编译的二进制文件后,GDB开始按预期工作。
答案 1 :(得分:1)
通过将dir
设置为源路径进行检查。
示例:假设源代码位于/home/exp/mp3decoder
之后
gdb --args mp3decode test.mp3
gdb dir /home/exp/mp3decoder