0

我正在尝试使用通过 emacs 运行的 gdb 进行调试,但没有成功。我不断得到众所周知的“找不到调试符号”。我认为问题出在我使用 -g 标志编译的方式上,但我不知道我的错误在哪里。这是生成文件:

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 时,我收到此消息:Reading symbols from /home/alexander/physics with computer/final/tree...(no debugging symbols found)...done。

非常感谢!

4

2 回答 2

1

当我尝试运行 gdb 时,我收到此消息:Reading symbols from /home/alexander/physics with computer/final/tree...(no debugging symbols found)...done。

很明显,您的构建实际上确实包含调试信息。因此,您一定是在调试您所构建的东西(其他副本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

于 2012-08-28T06:21:01.103 回答
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 现在有不同的抱怨。你忘了重建你的资源吗?

于 2012-08-27T13:51:34.170 回答