makefile中的gdb和valgrind
我有一个非常基本的问题。 我确实在这里环顾四周http://www.cs.cmu.edu/~gilpin/tutorial/但仍然怀疑..
考虑以下makefile(在之前的问题中也给出了它)
all: clients.so simulator backup LD_PRELOAD=/home/Juggler/client/clients.so ./simulator backup: backup.c libclient.a gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl simulator: simulator.c libclient.a gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread libclient.a: libclient.o client.o ar rcs libclient.a libclient.o client.o libclient.o:libclient.c gcc -c libclient.c -o libclient.o -pthread clients.so: client.o client_invoke.o ld -shared -o clients.so client_invoke.o client.o -ldl client_invoke.o: client_invoke.c gcc -Wall -fPIC -DPIC -c -g client_invoke.c client.o: client.c gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread
我该怎么做/更改为使用gdb或valgrind进行调试。 实际上我在做make时遇到了分段错误,想要调试。 但我从未在makefile中使用过gdb或valgrind
谢谢
我对你的演讲做了一个小编辑。 你最初写的
client.o: client.c gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread
你能把它改成新的forms,看看是否make segfaults?
通常我会做一些事情的效果:
$(DEBUGGER) ./simulator
然后
$ make DEBUGGER=gdb --args $ make DEBUGGER=valgrind $ make # should still work without the debugger.
(从技术上讲,命令不需要–args,但是如果你将来向模拟器添加参数。)
但是使用LD_PRELOAD会使这变得复杂,因为您可能不希望gdb加载libclient
gdb -ex 'set env LD_PRELOAD=/home/Juggler/client/clients.so' -ex 'run' ./simulator
此外,通过gcc通过gcc -shared -o client.so链接共享库是正常的
一种不优雅的方式是通过makefile生成进程,然后在另一个终端中使用GDB连接到它。 使用linux中的技巧:启动时挂起进程 ,你可以启动进程并立即暂停,然后连接gdb。
有一个名为launch.sh的脚本:#!/ bin / bash
echo "Pid is $$" echo -n "Press Enter.." read exec $@
有这样的makefile配方:
whatever_target: whatever_deps ./launch.sh PROGRAM [ARGS]
如果由于某种原因您无法看到输出(如果您正在重定向),您仍然可以通过ps -ef或其他东西获得PID。 然后用gdb:
gdb PROGRAM_NAME PID