如何使用gdb调试“Abort trap:6”错误

我有一个C程序,我用两种方式之一编译:“常规”和“调试” .

当我运行"regular"构建时,我收到一条 Abort trap: 6 错误消息,我需要修复它 .

当我在 gdb 中运行"debug"版本时,我没有收到错误消息,程序运行完成 .

“常规”构建的编译选项和标志是:

BLDFLAGS = -Wall -Wextra -pedantic -std=c99
CFLAGS = -D__STDC_CONSTANT_MACROS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -O3

“debug”构建的编译标志是:

BLDFLAGS = -Wall -Wextra -pedantic -std=c99
CDFLAGS = -D__STDC_CONSTANT_MACROS -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -DDEBUG=1 -g -O0 -fno-inline

“常规”和“调试”目标的编译方式如下:

regular: setup
    $(CC) $(BLDFLAGS) $(CFLAGS) -c $(SOURCE) -o $(OBJDIR)/$(PROG).o $(INCLUDES)
    $(CC) $(BLDFLAGS) $(CFLAGS) $(OBJDIR)/$(PROG).o -o $(PROG) -lpthread

debug: setup
    $(CC) $(BLDFLAGS) $(CDFLAGS) -c $(SOURCE) -o $(OBJDIR)/$(PROG).o $(INCLUDES)
    $(CC) $(BLDFLAGS) $(CDFLAGS) $(OBJDIR)/$(PROG).o -o $(PROG) -lpthread

基本上,这些目标是相同的处理,但 CFLAGSCDFLAGS 变量除外 .

我可以发布数百行C代码,但调试代码几乎与常规代码相同,但发送到 stderr 的更详细的注释除外 .

是否有 CDFLAGS ("debug"构建标志)的组件阻止 gdb 能够在 SIGABRTAbort trap: 6 )上停止处理?

回答(1)

2 years ago

是否有CDFLAGS的组件(“调试”构建标志)阻止gdb在SIGABRT上停止处理

你似乎误解了发生了什么 .

并不是说GDB没有在 SIGABRT 停止 . 这是因为你的应用程序在没有优化的情况下进行编译时,首先不会调用 abort

应用程序错误仅出现在优化版本中并不罕见 .

在大多数平台上,您可以将 -g 添加到"regular"构建,在GDB下运行生成的二进制文件,当GDB在 SIGABRT 上停止时,使用GDB where 命令检查调用堆栈 .

即使没有 -g ,你也可以做到这一点 . 您仍然应该获得堆栈跟踪,但文件/行信息将丢失 .