GDB не останавливается на точке останова

Я пытаюсь отладить общую библиотеку, которая работает под Регистрация в сценарии модульного тестирования. Общая библиотека статически связана (no 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 ответов


Я не знаю специфики check фреймворк, который вы используете, но некоторые такие фреймворки выполняют тестируемый код в дочернем процессе. Если check делает это, тогда ваше поведение ожидается - вы только отлаживаете родительский процесс,но ваш код выполняется в дочернем.

вы можете легко подтвердить это предположение: заменить printf в коде с abort. Если GDB не останавливается на SIGABRT, тогда моя догадка, вероятно, правильная, и вы захотите (gdb) set follow-fork-mode child.

кроме того, читайте на мульти-уступает отладки. вы можете попросить GDB отладить как родителя, так и ребенка с помощью set detach-on-fork off (документация).