调试GCC,有点烦。
首先,gcc程序本身并非真正的编译器,它调用cc1或者cc1plus完成真正的编译工作,而cc1(或cc1plus)的参数并非与调用gcc时使用的参数一直,所以必须添加-v选项,把实际调用cc1(或cc1plus)的命令行找出来,然后传给gdb。
其次,我想在Emacs里面调试……
终于不胜其烦,写了自动化脚本(取名debug.sh),使得启动gdb的过程简化为如下:
$ gcc -O -c hello.c # 啊!? 有bug?! $ debug.sh !!
脚本内容如下:
#!/bin/bash CC=$1 if [ -z "$CC" ] then echo "Usage:" echo " debug.sh gcc -O -c hello.c" exit 0 fi shift CC1_CMD=$($CC -v "$@" 2>&1 | grep -E 'cc1(plus)? ') echo $CC1_CMD : ${EMACSCLIENT:=/usr/bin/emacsclient} echo "Using $EMACSCLIENT" if `$EMACSCLIENT --help | grep '\-e, --eval\b' >/dev/null` then EMACSCLIENT_OPTIONS="-n" if [ -n "$DISPLAY" ] then if `$EMACSCLIENT --help | grep '\-c, --create-frame\b' >/dev/null` then EMACSCLIENT_OPTIONS="$EMACSCLIENT_OPTIONS -c" elif `$EMACSCLIENT --help | grep '\-nw, -t, --tty\b' >/dev/null` then EMACSCLIENT_OPTIONS="$EMACSCLIENT_OPTIONS -nw" fi elif `$EMACSCLIENT --help | grep '\-nw, -t, --tty\b' >/dev/null` then EMACSCLIENT_OPTIONS="$EMACSCLIENT_OPTIONS -nw" fi $EMACSCLIENT $EMACSCLIENT_OPTIONS \ --eval "(gdb \"gdb -cd $PWD --annotate=3 --args $CC1_CMD\")" else echo "Emacsclient doesn't support --eval option." echo "Use gdb directly" gdb --args $CC1_CMD fi
实际上,我的脚本还包括了寻找和加载编译目录下的.gdbinit文件,但是局限于特定结构,不能普遍使用,所以上面的脚本并没有包括这部分功能。有兴趣的话,可以根据自己的目录结构添加此功能,我是用-x $GDBINIT的方式传给gdb的。