使用gdb进行调试 - 正确使用带有多个文件的-g标志

时间:2012-08-27 13:24:07

标签: makefile gdb

我正在尝试使用通过emacs运行它的gdb进行调试,但没有成功。我继续得到众所周知的“找不到调试符号”。我假设问题是我使用-g标志编译的方式,但我不知道我的错误在哪里。这是makefile:

all: tree

tree: main.o OctTree.o my_vec.o runge_kutta.o initialize.o global.o
    g++ -g -o tree main.o OctTree.o my_vec.o runge_kutta.o initialize.o global.o -lm

main.o: main.cpp OctTree.h my_vec.h global.h
    g++ -g -o3 main.cpp -o main.o 

my_vec.o: my_vec.cpp my_vec.h
    g++ -g -o3 my_vec.cpp -o my_vec.o

OctTree.o: OctTree.cpp OctTree.h my_vec.h global.h
    g++ -g -o3 OctTree.cpp -o OctTree.o

runge_kutta.o: runge_kutta.cpp OctTree.h my_vec.h global.h
    g++ -g -o3 runge_kutta.cpp -o runge_kutta.o

initialize.o: initialize.cpp my_vec.h OctTree.h global.h
    g++ -g -o3 initialize.cpp -o initialize.o

global.o : global.cpp global.h
    g++ -g -o3 global.cpp -o global.o

clean: 
    rm main.o my_vec.o OctTree.o runge_kutta.o initialize.o global.o-f

当我尝试运行gdb时,我收到此消息: 从/ home / alexander / physics用计算机/ final / tree读取符号......(没有找到调试符号)......完成。

非常感谢你!

2 个答案:

答案 0 :(得分:1)

最好利用make的功能使makefile更容易更改。例如:

# all cpp files (add files here if you add more to your project)
SRC_FILES = main.cpp my_vec.cpp OctTree.cpp runge_kutta.cpp initialize.cpp global.cpp
OBJ_FILES = $(addsuffix .o,$(basename $(SRC_FILES))) # autogenerated

# flags, options, and other crap
OUTPUT = tree
CXX_FLAGS = -c -g # -O3 # disable optimization for now
CXX_FLAGS_LINK = -g
LIBS = -lm

# first target
all: tree

# tree target: requires all object files, links them into output executable
tree: $(OBJ_FILES)
    g++ $(CXX_FLAGS_LINK) -o $(OUTPUT) $(OBJFILES) $(LIBS)

# generic target for any cpp file
%.o: %.cpp
    g++ $(CXX_FLAGS) -o %.o %.cpp

# clean target
clean: 
    rm main.o my_vec.o OctTree.o runge_kutta.o initialize.o global.o -f

# specific dependencies for each file
# you can generate these with g++ -MM <filename.cpp>
main.o: main.cpp OctTree.h my_vec.h global.h
my_vec.o: my_vec.cpp my_vec.h
OctTree.o: OctTree.cpp OctTree.h my_vec.h global.h
runge_kutta.o: runge_kutta.cpp OctTree.h my_vec.h global.h
initialize.o: initialize.cpp my_vec.h OctTree.h global.h
global.o : global.cpp global.h

我怀疑你遇到的问题与编译器在O3上有效处理代码的长度有关。再试一次,没有优化,看看是否适合你。

我根本没有测试过这个makefile。

编辑:

好的,您已尝试禁用优化。你试过make clean并重新编译优化了吗?你是如何启动调试器的?关闭优化,即使GDB现在有不同的抱怨,也无法与调试相处。你忘了重建你的资源吗?

答案 1 :(得分:1)

  

当我尝试运行gdb时,我收到此消息:从/ home / alexander / physics读取带有计算机/ final / tree的符号...(未找到调试符号)...完成。

很明显,您的构建确实包含调试信息。因此,它必须是你正在调试其他而不是你构建的东西(tree的其他一些副本)。

你应该

  1. 确认二进制文件有调试信息。例如:

     cd /home/alexander/physics/computer/final
     readelf -wl tree | grep 'runge_kutta\.cpp'
    

    应该产生一些输出。和

     readelf -w tree
    

    应该产生很多的输出。

  2. 确认您可以在emacs之外调试此二进制文件:

    gdb ./tree
    

    这应生成no debugging symbols found

  3. 现在在emacs中调试这个二进制文件:

    M-x gdb
    

    将命令设为gdb /home/alexander/physics/computer/final/tree

    如果步骤2有效,则步骤3也不会产生no debugging symbols found