Linux GDB反向执行
1. 应用场景反向执行(Reverse Execution)应用在:当发现执行太过了的时候,关注的问题可能已经发生了,需要反向执行。
需要目标环境支持,不是所有目标环境都可以实现反向执行的。
2. 程序执行的记录(record)和重放(replay)record会拖慢程序执行速度。
如果执行日志中包括下一条指令的执行记录,GDB会使用replay mode,此时运行程序不会真正执行代码,而是从执行日志中恢复程序状态。
否则如果执行日志中不包括下一条指令的执行记录,GDB会使用record mode,此时运行程序会正常执行,但GDB会记录执行日志以备将来replay。
即使程序运行的平台不支持Reverse Execution,在执行日志记录的范围内,GDB也可以通过replay支持Reverse Execution。
在反向执行时,如果执行日志包括先前指令的记录,GDB会使用replay mode,否则,如果平台支持反向执行,GDB会使用record mode,如果不支持则stop。
3. record和replay相关的命令3.1 record [METHOD]缩写为rec [MET ...
Linux GDB Convenience Variables
1. 基本介绍
形式为以$开头的名字(以$开头的数字不是)
无固定类型,甚至可以是结构体或者数组
2. 赋值使用set命令,如set $foo = *object_ptr
3. 使用示例不断使用回车遍历数组:
12set $i = 0p arr[$i++]
Linux GDB 多线程调试
1. All-Stop Mode这是GDB的默认模式(共两个模式,另一个为Non-Stop Mode)。
当一个线程stop时(比如因为hit断点),所有线程都stop。
类似地,当继续执行这个线程时(比如使用step或者next命令),所有其他线程也会恢复执行,但它们不受当前线程的step或者next命令控制而自由执行(因为线程调度依赖kernel,而不受GDB控制),因此可能执行任意条语句。而且当这些其他线程遇到断点时会导致GDB发生自动线程切换,此时原线程的step或者next命令甚至可能还没执行完。
1.1 锁住OS scheduler这是为了在恢复执行时只允许一个线程运行。
scheduler锁定模式有多种,使用命令set scheduler-locking <mode>设置,show scheduler-locking获取。
可用的模式有:
off 无锁定,任意线程可以任意运行。
on 只有当前线程可以运行,其他线程依然stop。
step 当单步执行时效果类似on,使用其他执行命令(如continue, until, finish)时类似off。(由于机 ...
Linux GDB TUI(Text User Interface)
1. GDB tui常用命令1.1 启动和退出tui模式
分别是tui enable(缩写为tui e)和tui disable(缩写为tui d)命令
或者使用快捷键ctrl+x+a,按第一次进入,第二次退出
1.2 ctrl+L 刷新屏幕在程序使用标准输出和标准错误打印时屏幕可能乱掉,可以使用ctrl+L进行刷新
ctrl+L不会被记在命令历史里,下一次ENTER不会重复ctrl+L
1.3 info win命令列出当前显示的所有窗口
1.4 focus命令缩写为fs,改变焦点到不同窗口,使用方式focus [WINDOW-NAME | next | prev]
1.5 查看文档使用help text-user-interface查看tui相关所有命令
2. CGDBCGDB是GDB的一个控制台前端(Console Frontend),它还是使用GDB进行实际调试
GDB的tui模式不支持源码窗口和命令窗口垂直分屏,因此使用CGDB
2.1 使用1. 启动在shell中输入cgdb启动程序
调用方式类似GDB:
1cgdb [cgdb options] [--] [gdb ...
Linux GDB Watchpoint
1. 基本概念watchpoint又称data breakpoint,用于监控某个表达式,当它的值改变时stop程序。
表达式可以是单个变量,也可以包含操作符(任意原语言中有效的操作符)。
2. 分类2.1 software watchpointGDB单步执行程序,然后每次都计算表达式值。因此程序执行速度可能慢了数百倍,而且它在被监控值改变后的下一条语句处才报告值改变,而非在确切的CPU指令处。
2.2 hardware watchpoint依赖硬件支持(如x86架构),不会减慢程序执行速度,且在改变被监控值的CPU指令执行时即能及时报告。
GDB会尽可能创建hardware watchpoint。
有时GDB不能创建hardware watchpoint,可能的原因包括:
要监控的内存区域过大。(此时GDB可能把它拆分成多个小的hardware watchpoint)。
已经设置了太多hardware watchpoint。但可能到程序resume执行时(而不是创建watchpoint时)GDB才会报告”Hardware watchpoint : Could not insert ...
Linux生成静态库
1. 使用ar -M [ < merge.script ]命令写一个脚本merge.script,将脚本重定向给ar -M命令的stdin。
使用create传入输出的静态库文件名,addlib传入输入的静态库,addmod传入输入的目标文件,最后调用save和end。
123456789create <libmerged.a>addlib <libfirst.a>addlib <libsecond.a>...addmod <object_first.o>addmod <object_second.o>...saveend
2. 注意排列顺序把必须包括其所有符号的输入库放在前面,因为在后面库中包含重复符号名的时候可能直接丢弃以前面为准。
3. 参考
stackoverflow
文档
Linux sed命令使用方法
1. 缩写sed是stream editor的缩写。
2. 常用选项
-i,原地修改输入文件
3. 常见使用场景3.1 替换某个文本的所有出现使用方法为sed 's/<word1>/<word2>/g' input.txt
s指substitution(替换)
/是分隔符,也可以是其他字符作分隔符,如+
<word1>是被替换的字符串
<word2>是要替换为的字符串
g表示global(全局替换),不指定g的话只会替换每一行的第一次出现的<word1>。
3.2 删除指定行行编号都是从1开始
sed '<n>d' input.txt,删除第<n>行
sed '$d' input.txt,删除最后一行
sed '<start>,<end>d' input.txt,删除第<start>到<end>行(闭区间)
4. sed的正则表达式sed默认使用Basic Regul ...
Linux vim常用命令
1. 查找1.1 向后查找命令为/<search_word>然后回车,使用n定位到下一次出现,使用N定位到上一次出现
1.2 向前查找使用命令?<search_word>
1.3 case-insensitive查找默认是case-sensitive的,若想insensitive,在<search_word>前或者后添加\c
例如/<search_word>\c
2. 替换2.1 全文替换命令为:%s/<search_word>/<replace_word>/g
将全文中所有的<search_word>替换为<replace_word>,这是case-sensitive的
若想case-insensitive,给上述命令添加i选项
2.2 每次替换时询问若想在每次替换实际发生时询问是否确认,给上述命令添加c选项(c表示confirmation),即
:%s/<search_word>/<replace_word>/gc
在prompt出现时的回答包括:
y,表示ye ...
十一月四日风雨大作二首
十一月四日风雨大作二首
[宋] 陆游
(其一)
风卷江湖雨暗村,四山声作海涛翻。
溪柴火软蛮毡暖,我与狸奴不出门。
(其二)
僵卧孤村不自哀,尚思为国戍轮台。
夜阑卧听风吹雨,铁马冰河入梦来。
唐太宗封禅与魏征答问
出自《资治通鉴·唐纪·唐纪十》
上曰:“公不欲朕封禅者,以功未高邪?”曰:“高矣。”“德未厚邪?”曰:“厚矣。”“中国未安邪?”曰:“安矣。”“四夷未服邪?”曰:“服矣。”“年谷未丰邪?”曰:“丰矣。”“符瑞未至邪?”曰:“至矣。”“然则何为不可封禅?”对曰:“陛下虽有此六者,然承隋末大乱之后,户口未复,仓廪尚虚,而车驾东巡,千乘万骑,其供顿劳费,未易任也。且陛下封禅,则万国咸集,远夷君长,皆当扈从;今自伊、洛以东至于海、岱,烟火尚希,灌莽极目,此乃引戎狄入腹中,示之以虚弱也。况赏赉不赀,未厌远人之望;给复连年,不偿百姓之劳;崇虚名而受实害,陛下将焉用之!”