调试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的。





