openwrt 学习常用命令及备注( 四 )


-u -U NUM --unified[=NUM] // 按统一格式输出,子啊补丁中输出前后NUM行,默认是3行
-N --new-file // 在补丁文件里包含新的文件内容
-r --recursive // 递归比较子目录,很多文件在不同目录里修改时使用
patch工具:
应用补丁命令如下:
$:' patch -p1 < ../dhcp.patch
恢复应用前的补丁,使用-R参数来执行,即返回到应用补丁前的代码的命令:
$:' patch -R -p1 < ../dhcp.patch
如果补丁文件是gzip和bzip2压缩的,使用如下命令:
$:' zcat path/to/dhcp_patch.z.gz | patch -p1
$:' bzcat path/to/dhcp_patch.z.bz2 | patch -p1
patch工具主要参数如下:
-f // 强制打入补丁,不用询问
-p1 // 略过一层前导目录
-E // 打完补丁后,如果文件内容为空,会将其移除
-d // 在指定目录下执行
-R // 用于删除补丁
--dry-run // 尝试打入补丁,输出打入补丁之后的结果,但不做任何真正修改
--verbose // 告诉patch输出当前尽可能多的信息
【GDB调试】2017.05.18
GDB是GNU项目开发的针对C/C++的语言代码调试工具 。
GDB主要有4个功能来帮助捕捉发生bug时的状态:
1. 启动应用程序;
2. 调试断点点可停住;
3. 检查程序中当前的状态;
4. 动态改变程序;
启动程序调试:
在编译的时候加上 -g 选项即可产生调试信息,通常程序交给客户的时候会使用 -O 选项来优化,有一些编译器不能同时处理 -g 和 -O 选项 。例如:
$:' g++ -g hello.c -o hello
$:' gdb hello
常用GDB命令:
break // 在指定的位置或函数处设置断点
run // 开始执行调试程序
bt // 查看程序运行栈信息,例如:bt full
continue // 在程序中断之后继续执行程序
next // 单步执行,如果是函数则执行完这个函数
step // 单步执行,如果是函数则进入函数内部
set args // 设置启动参数 set args
print // 输出表达式或变量值
quit // 退出程序调试
list // 输出现在执行程序停止位置附近的代码
help // 输出GDB命令的帮助信息
环境变量设置:
(gdb)show paths
// 显示程序的查找路径列表
(gdb)show environment HOME
// 显示系统的环境变量
(gdb)set environment varname[=value]
// 设置环境变量
(gdb)unset environment varname
// 取消环境变量设置
设置日志文件:
(gdb)set logging on
// 经屏幕输出同时输出到文件中,默认输出到当前目录下的 gdb.txt
(gdb)set logging off
// 关闭log
(gdb)set logging file file
// 默认输出为gdb.txt 此命令可以将当前输出的log文件名改名
(gdb)set logging overwrite
// overwrite参数可以每次重写一个全新的文件
(gdb)show logging
// 输出当前日志的设置
获取帮助,如:
$:' help
$:' help stack
命令总结:
(gdb)run // 启动调试程序
(gdb)attach // 关联到正在运行中的进程
(gdb)set args // 设置程序启动时的参数
(gdb)show args // 显示启动参数
(gdb)set environment // 设置环境变量
(gdb)show environment // 如果没有参数就显示左右环境变量
(gdb)unset environment // 取消环境变量设置
(gdb)help // 获取帮助
(gdb)apropos // 搜索命令帮助
指令断点管理:
break [LOCATION] [thread THREADNUM] [if CONDITION]
LOCATION:可以是代码行号、函数名、或者一个带有星号的地址
THREADNUM:是线程号,可以用 info threads 命令来查看线程号
(gdb)info threads // 查看线程号
(gdb)info break // 显示断点信息命令
CONDITION:是一个布尔表达式
tbreak 用于设置一个临时断点,当命中这个断点后将删除断点 。
clear 或 delete 可以用于删除断点 。
disable 比断点删除更好的办法,暂时不生效,使用的时候可再次启用,格式如下:
(gdb)disable [breakpoints] [range...]
// breakpoints 为断点编号,如果不指定,表示所有断点都不生效
(gdb)enable [breakpoints] [range...]
// 启用所指定的断点 。
例如:
(gdb)delete breakpoint 1 // 删除编号为1的断点
(gdb)disable breakpoint 1 // 禁止编号为1的断点
(gdb)enable breakpoint 1 // 允许编号为1的断点
(gdb)clear 50 // 50为源文件行号,该位置的所有断点将被清除
观察点管理:
观察点,是一个特殊的断点,如果表达式修改了值程序执行就停止了,表达式可以是变量,也可以是几个变量的组合,有时也叫数据断点 。
watch // 为表达式设置一个观察点,一旦表达式值发生变化时,马上停止执行程序


推荐阅读