2013-07-21 242 views
5

我試圖調試在單元測試場景下運行在check下的共享庫。 共享庫是靜態鏈接(無dlload)並且兩個單元測試應用程序和共享庫與調試符號(-ggdb不停止在斷點

gdb我想設置在包含在共享庫中的函數斷點編譯。 我成功設置了一個斷點,但是當它運行時它只是通過斷點。

我已經嘗試過:

我的共享庫放在printf,它打印出來,因此函數實際上是調用。

下面是我使用的編譯生成文件:

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) 

回答

12

我不知道你正在使用的check框架的細節,但一些這樣的框架,一個孩子代碼執行被測處理。如果check這樣做,那麼你的行爲是預期的 - 你只是調試父進程,但你的代碼在一個孩子執行。

您可以輕鬆確認此猜測:將代碼中的printf替換爲abort。如果GDB不停止在SIGABRT上,那麼我的猜測可能是正確的,並且您需要(gdb) set follow-fork-mode child

或者,請閱讀multi-inferior debugging.您可以要求GDB使用set detach-on-fork offdocumentation)調試父母和孩子。

+0

你是對的,我解決了這個問題,通過在check框架中使用調試選項來關閉分叉。謝謝。 - http://check.sourceforge.net/doc/check_html/check_4.html#No-Fork-Mode – stdcall