2011-09-18 24 views
2

我有一个非常基本的问题。我环顾四周像在这里http://www.cs.cmu.edu/~gilpin/tutorial/但仍doubtfull ..gdb和valgrind在一个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时遇到了分段错误,并且想要调试。但我从来没有用gdb或从Valgrind的一个makefile文件中

感谢

回答

1

我做了一个小编辑到演示文稿。你原本写的

client.o: client.c  gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread 

你能改变它到新的形式,看看是否使段错误?

+0

只会看看...感谢 –

+0

:-(没有帮助,可能只是我在你编辑 –

0

通常我会做一些事情来的效果:

$(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

+0

个问题部分打字错误似乎并不奏效...仍然得到分段错误,但没有来自gdb –

+1

的帮助没有考虑LD_PRELOAD,我不知道gdb是否支持通过'gdb LD_PRELOAD = ... ./simulator'设置环境变量,无论如何设置LD_PRELOAD为gdb命令可能不是一个好主意,但它应该传递给'模拟器'命令。 – matt

0

一个不雅的方法是通过生成文件产卵的处理,然后在另一个附加到它与GDB终奌站。使用linux: suspend process at startup的技巧,您可以启动该进程并立即挂起,然后连接到gdb。

都称为脚本launch.sh: #/斌/庆典

echo "Pid is $$" 
echo -n "Press Enter.." 
read 
exec [email protected] 

有一个makefile食谱是这样的:!

whatever_target: whatever_deps 
     ./launch.sh PROGRAM [ARGS] 

如果由于某种原因,你无法看到输出(如果你正在重定向),你仍然可以通过ps -ef或其他东西获得PID。然后用gdb:

gdb PROGRAM_NAME PID