调试GCC

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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据