简介:
SED代码调试法,使用LINUX命令sed, 在函数首部添加函数名打印打印,以方便了解代码运行流程。 目前我所发布的sed的正则表达式仅适用于C语言代码。
命令:
1. 添加函数名打印
命令中的“pr_err” 是打印函数, 可以替换。
ls *.c | xargs sed -i '/)$/{n;s/^{/&\n\tpr_err("%s:in %d.\\n",__func__,__LINE__);/}; /)[[:blank:]]*{$/{s/^[^[:blank:]].*/&\n\tpr_err("%s:in %d.\\n",__func__,__LINE__);/}'
2. 无__func__,添加函数名打印
某些编译器不支持__func__功能,则可以使用以下命令。
sed '/^[^/].*)$/{N;s/\(^[^[:blank:]]\+.*(.*)\)[[:blank:][:space:]]*{$/&printf("\1\\n");/}' *.c -i
3. 打印switch里的所有case
ls *.c | xargs sed 's/[[:blank:]]\+\bcase\b\(.*\):/&\n\tpr_err("in \1\\n");/' -i
打印case指定行号, 1919至2153, 这两个行号可以替换。
sed '1919,2153{s/^[[:blank:]]\+\bcase\b\(.*\)/&\n\tprintf("in \1\\n");/}' *.c -i
打印switch里的default。
ls *.c | xargs sed 's/[[:blank:]]\+\bdefault\b\(.*\):/&\n\tpr_err("in default\\n");/' -i
4. 打印return出口
ls *.c | xargs sed -i 's/\(\breturn\b[^;]*;\)/{pr_err("%s: out at %d.\\n",__func__, __LINE__);\1}/'
使用示例:
在uboot的driver/usb/host下执行以下命令:
ls *.c | xargs sed -i '/)$/{n;s/^{/&\n\tpr_err("%s:in %d.\\n",__func__,__LINE__);/}; /)[[:blank:]]*{$/{s/^[^[:blank:]].*/&\n\tpr_err("%s:in %d.\\n",__func__,__LINE__);/}'
重新编译烧录uboot,获得以下打印(截取部分)。
解析:函数名后的数字,是此函数所在的行号。
starting USB...
usb_init:in 267.
Bus usb@5311000: ehci_usb_probe:in 84.
ehci_enable_vbus_supply:in 71.
ehci_setup_phy:in 1799.
ehci_register:in 1727.
ehci_setup_ops:in 1009.
ehci_reset:in 188.
handshake:in 171.
ehci_common_init:in 1044.
USB EHCI 1.00
usb_scan_bus:in 230.
scanning bus usb@5311000 for devices... usb_scan_device:in 618.
usb_get_bus:in 772.
usb_setup_device:in 1232.
usb_prepare_device:in 1093.
usb_alloc_device:in 138.
usb_setup_descriptor:in 1009.
get_descriptor_len:in 963.
usb_get_descriptor:in 580.
usb_control_msg:in 233.
submit_control_msg:in 63.
ehci_submit_control_msg:in 1655.
usb_get_bus:in 772.
ehci_submit_root:in 718.
ehci_get_ctrl:in 116.
usb_get_bus:in 772.
usb_select_config:in 1142.
get_descriptor_len:in 963.
usb_get_descriptor:in 580.
usb_control_msg:in 233.
submit_control_msg:in 63.
ehci_submit_control_msg:in 1652.
_ehci_submit_control_msg:in 1219