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