GDB и Valgrind в make-файле - PullRequest
       31

GDB и Valgrind в make-файле

2 голосов
/ 18 сентября 2011

У меня очень простой вопрос. Я выглядел как здесь http://www.cs.cmu.edu/~gilpin/tutorial/ но все еще сомнительно ..

Рассмотрим следующий make-файл (также дал его в предыдущем вопросе)

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 из make-файла

Спасибо

Ответы [ 3 ]

1 голос
/ 18 сентября 2011

Я внес небольшое изменение в вашу презентацию. Вы изначально написали

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

Можете ли вы изменить его на новую форму и посмотреть, сделаете ли вы segfaults?

0 голосов
/ 03 июня 2013

Один не элегантный способ - запустить процесс через make-файл, а затем подключиться к нему с помощью GDB в другом терминале. Используя трюк из linux: приостановить процесс при запуске , вы можете запустить процесс и немедленно приостановить его, а затем подключиться к gdb.

есть скрипт с именем launch.sh: #! / Bin / Баш

echo "Pid is $$"
echo -n "Press Enter.." 
read 
exec $@

есть рецепт makefile, подобный этому:

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

если по какой-то причине вы не видите вывод (например, если вы перенаправляете), вы все равно можете получить PID через ps -ef или что-то еще. затем с помощью GDB:

gdb PROGRAM_NAME PID
0 голосов
/ 18 сентября 2011

обычно я бы сделал что-то с эффектом:

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

...