我正在尝试调试在单元测试场景中运行在
check下的共享库.
共享库是静态链接的(没有dlload),单元测试应用程序和共享库都使用调试符号(-g)编译
共享库是静态链接的(没有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)
解决方法
我不知道你正在使用的检查框架的细节,但是一些这样的框架在子进程中执行测试中的代码.如果检查确实如此,那么您的行为是预期的 – 您只是调试父进程,但您的代码在子进程中执行.
您可以轻松确认此猜测:使用abort替换代码中的printf.如果GDB没有在SIGABRT上停止,那么我的猜测可能是正确的,你需要(gdb)设置follow-fork-mode子.
或者,请阅读multi-inferior debugging.您可以要求GDB使用set detach-on-fork off(documentation)调试父级和子级.