gdb不会在断点上停止

时间:2013-07-21 17:38:34

标签: c gdb shared-libraries breakpoints

我正在尝试调试在单元测试场景中在check下运行的共享库。 共享库是静态链接的(无dlload),单元测试应用程序和共享库都使用调试符号(-g)进行编译

gdb中我想在共享库中包含的函数中设置断点。 我成功设置了断点,但是当它运行时它只是越过断点。

我已经尝试过了:

我在共享库中放置了一个printf,它被打印出来,因此实际调用了该函数。

这是我用于编译的Makefile:

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 $@ -c $<

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

runtests:
    ./$(TEST_TARGET)

1 个答案:

答案 0 :(得分:13)

我不知道你正在使用的check框架的细节,但是一些这样的框架在子进程中执行测试中的代码。如果check执行此操作,那么您的行为是预期的 - 您只是调试父进程,但您的代码在子进程中执行。

您可以轻松确认此猜测:将代码中的printf替换为abort。如果GDB没有在SIGABRT上停止,那么我的猜测可能是正确的,您需要(gdb) set follow-fork-mode child

或者,阅读multi-inferior debugging.您可以要求GDB使用set detach-on-fork offdocumentation)调试父级和子级。