Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C gdb不';不要在断点上停止_C_Gdb_Shared Libraries_Breakpoints - Fatal编程技术网

C gdb不';不要在断点上停止

C gdb不';不要在断点上停止,c,gdb,shared-libraries,breakpoints,C,Gdb,Shared Libraries,Breakpoints,我试图调试一个在单元测试场景下运行的共享库。 共享库是静态链接的(nodlload),单元测试应用程序和共享库都使用调试符号(-g)编译 在gdb中,我想在共享库中包含的函数中设置断点。 我成功地设置了一个断点,但当它运行时,它只是通过了断点 我已经尝试过的: SHELL = /bin/sh CC = gcc CFLAGS = -g -Wall -std=gnu99 -Iinclude EXTRA_FLAGS = -fPIC -shared LIBFLAGS = -f

我试图调试一个在单元测试场景下运行的共享库。 共享库是静态链接的(no
dlload
),单元测试应用程序和共享库都使用调试符号(
-g
)编译

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

我已经尝试过的:

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)
我在共享库中放置了一个
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)
SHELL=/bin/sh
CC=gcc
CFLAGS=-g-墙-std=gnu99-包括
额外_标志=-fPIC-共享
LIBFLAGS=-fPIC-shared
LDFLAGS=-shared-pthread-lcheck
DEBUGFLAGS=-O0-D\u调试
RELEASEFLAGS=-O2-D NDEBUG-combine-fwhole程序
TEST_LDFLAGS=-lcheck-lllist-Llib-Wl,-rpath$(OBJDIR)
OBJDIR=lib
TARGET=$(OBJDIR)/libllist.so
测试目标=开始测试
SOURCES=$(shell echo src/*.c)
标题=$(shell echo inc/*.h)
测试源=$(外壳回波测试/*.c)
测试对象=$(测试源:.c=.o)
对象=$(源:.c=.o)
前缀=$(DESTDIR)/usr/local
BINDIR=$(前缀)/bin
所有:$(目标)测试
$(目标):$(对象)
mkdir-p$(OBJDIR)
$(CC)$(标志)$(LIBFLAGS)$(DEBUGFLAGS)-o$(目标)$(对象)
测试:$(测试对象)
$(CC)$(标志)-o$(测试目标)$(测试对象)$(测试标志)
#需要一个特殊的规则来编译库以允许额外的_标志
$(对象):$(源)
@echo[编译]:$<
$(CC)$(CFLAGS)$(额外标志)-o$@-c$<
清洁:
rm-rf$(测试对象)$(对象)*~$(目标)$(测试对象)
运行测试:
./$(测试目标)

我不知道您正在使用的
check
框架的细节,但是有些框架在子进程中执行测试中的代码。如果
check
这样做,那么您的行为是正常的——您只调试父进程,但您的代码在子进程中执行

您可以很容易地确认这个猜测:将代码中的
printf
替换为
abort
。如果GDB没有在
SIGABRT
上停止,那么我的猜测可能是正确的,并且您需要
(GDB)设置follow fork mode child


或者,仔细阅读您可以要求GDB使用
set detach on fork off
()调试父级和子级。

您是对的,我通过在check framework中使用调试选项关闭fork来解决这个问题。谢谢-