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