2013-07-21 14 views
5

Sto tentando di eseguire il debug di una libreria condivisa che viene eseguita in check in uno scenario di test unitario. La libreria condivisa è linkato staticamente (senza dlload) e sia l'applicazione di unit test e la libreria condivisa sono compilati con i simboli di debug (-g)gdb non si ferma al punto di interruzione

In gdb voglio impostare un punto di interruzione in una funzione contenuta nella libreria condivisa . Ho impostato correttamente un punto di interruzione, ma quando viene eseguito passa sopra il punto di interruzione.

Quello che ho provato già:

ho messo una printf nella libreria condivisa, che viene stampato, per cui la funzione è effettivamente chiamato.

Ecco il Makefile che sto utilizzando per la compilazione:

SHELL = /bin/sh 
CC = gcc 
CFLAGS  = -g -Wall -std=gnu99 -Iinclude 
EXTRA_FLAGS = -fPIC -shared 
LIBFLAGS  = -fPIC -shared 
LDFLAGS  = -shared -pthread -lcheck 
DEBUGFLAGS = -O0 -D _DEBUG 
RELEASEFLAGS = -O2 -D NDEBUG -combine -fwhole-program 
TEST_LDFLAGS = -lcheck -lllist -Llib -Wl,-rpath $(OBJDIR) 

OBJDIR = lib 
TARGET = $(OBJDIR)/libllist.so 
TEST_TARGET = starttest 
SOURCES = $(shell echo src/*.c) 
HEADERS = $(shell echo inc/*.h) 
TEST_SOURCES = $(shell echo tests/*.c) 
TEST_OBJECTS = $(TEST_SOURCES:.c=.o) 
OBJECTS = $(SOURCES:.c=.o) 
PREFIX = $(DESTDIR)/usr/local 
BINDIR = $(PREFIX)/bin 

all: $(TARGET) tests 
$(TARGET): $(OBJECTS) 
    mkdir -p $(OBJDIR) 
    $(CC) $(FLAGS) $(LIBFLAGS) $(DEBUGFLAGS) -o $(TARGET) $(OBJECTS) 


tests: $(TEST_OBJECTS) 
    $(CC) $(FLAGS) -o $(TEST_TARGET) $(TEST_OBJECTS) $(TEST_LDFLAGS) 

# Need a special rule to compile the lib to allow EXTRA_FLAGS 
$(OBJECTS): $(SOURCES) 
    @echo [Compiling]: $< 
    $(CC) $(CFLAGS) $(EXTRA_FLAGS) -o [email protected] -c $< 

clean: 
    rm -rf $(TEST_OBJECTS) $(OBJECTS) *~ $(TARGET) $(TEST_TARGET) 

runtests: 
    ./$(TEST_TARGET) 

risposta

12

Non so specifiche del framework check che si sta utilizzando, ma alcuni di questi quadri eseguire codice sottoposto a test in un bambino processi. Se lo fa check, il tuo comportamento è previsto - stai solo mettendo a punto il processo genitore, ma il tuo codice viene eseguito in un bambino.

È possibile confermare facilmente questa ipotesi: sostituire lo printf nel codice con abort. Se GDB non si ferma su SIGABRT, la mia ipotesi è probabilmente corretta, e ti consigliamo di (gdb) set follow-fork-mode child.

In alternativa, consultare multi-inferior debugging. È possibile chiedere a GDB di eseguire il debug di entrambi i genitori e il figlio con set detach-on-fork off (documentation).

+0

Hai ragione, ho risolto il problema utilizzando l'opzione di debug per disattivare il biforcazione nel quadro di controllo. Grazie. - http://check.sourceforge.net/doc/check_html/check_4.html#No-Fork-Mode – stdcall

Problemi correlati