我有一个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
基本上,这些目标是相同的处理,但 CFLAGS
和 CDFLAGS
变量除外 .
我可以发布数百行C代码,但调试代码几乎与常规代码相同,但发送到 stderr
的更详细的注释除外 .
是否有 CDFLAGS
("debug"构建标志)的组件阻止 gdb
能够在 SIGABRT
( Abort trap: 6
)上停止处理?
1 回答
你似乎误解了发生了什么 .
并不是说GDB没有在
SIGABRT
停止 . 这是因为你的应用程序在没有优化的情况下进行编译时,首先不会调用abort
!应用程序错误仅出现在优化版本中并不罕见 .
在大多数平台上,您可以将
-g
添加到"regular"构建,在GDB下运行生成的二进制文件,当GDB在SIGABRT
上停止时,使用GDBwhere
命令检查调用堆栈 .即使没有
-g
,你也可以做到这一点 . 您仍然应该获得堆栈跟踪,但文件/行信息将丢失 .