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
(документация).