10

単体テスト シナリオでチェックの下で実行される共有ライブラリをデバッグしようとしています。共有ライブラリは静的にリンクされ (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)
4

1 に答える 1

17

使用しているフレームワークの詳細はわかりませんcheckが、そのようなフレームワークの中には、子プロセスでテスト対象のコードを実行するものがあります。もしそうならcheck、あなたの振る舞いは期待されています - あなたは親プロセスをデバッグしているだけですが、あなたのコードは子で実行されます。

この推測は簡単に確認できます。printfコード内の を に置き換えますabort。GDB が で停止しない場合SIGABRT、私の推測は正しい可能性が高く、停止する必要があります(gdb) set follow-fork-mode child

または、複数の劣ったデバッグについて読んでください。親と子の両方をデバッグするように GDB に依頼できますset detach-on-fork off( documentation )。

于 2013-07-21T18:48:16.877 に答える