如何调试"中止陷阱:6" gdb错误

时间:2014-11-12 22:43:14

标签: c debugging gdb sigabrt

我有一个C程序,我用以下两种方式之一编译:"常规"和"调试"。

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

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

"常规"的编译选项和标志。建立是:

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能够停止SIGABRT上的处理({{1} }})?

1 个答案:

答案 0 :(得分:2)

  

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

你似乎误解了正在发生的事情。

并非GDB没有停在SIGABRT上。这是因为您的应用程序在没有优化的情况下编译时,不会首先调用abort

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

在大多数平台上,您可以将-g添加到“常规”构建中,在GDB下运行生成的二进制文件,当GDB在SIGABRT上停止时,使用GDB检查调用堆栈{{1命令。

即使没有where,您也可以这样做。您仍然应该获得堆栈跟踪,但文件/行信息将丢失。