2011-09-18 23 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