我正在尝试使用通过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读取符号......(没有找到调试符号)......完成。
非常感谢你!答案 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
的其他一些副本)。
你应该
确认二进制文件有调试信息。例如:
cd /home/alexander/physics/computer/final
readelf -wl tree | grep 'runge_kutta\.cpp'
应该产生一些输出。和
readelf -w tree
应该产生很多的输出。
确认您可以在emacs之外调试此二进制文件:
gdb ./tree
这应不生成no debugging symbols found
现在在emacs中调试这个二进制文件:
M-x gdb
将命令设为gdb /home/alexander/physics/computer/final/tree
如果步骤2有效,则步骤3也不会产生no debugging symbols found
。