本来一次正常的操作是应该修改配置文件中的一个dumpquote的时间,然后重启程序。但那天修改配置文件后忘了重启,在指定时间没有生成特定quote文件。
此时想起了用gdb试试,大概思路就是:用调试器附加到进程,看能不能在一处特定的定时器函数入口打断点,如果可以就可以试着按参数文件里的参数修改一下内存中的变量,然后单步执行看是不是真的能进入到dump文件的函数。
# 启动GDB
gdb
# 附加到进程,xxxx为实际运行的进程id
attach xxxx
# attach后,进程实际是处于挂起状态
# 试着下断点,发现可以正常设置,后面就比较顺了
break StQuote.cpp:227
# 让程序继续执行,然后程序会在上一行设的断点处暂停
continue
# 观察两个关键变量,还好没有优化掉,可以看到具体值
p StCfg::dumpQuoteClock
p StQuote::quoteDumped
# 修改变量
print StCfg::dumpQuoteClock=54001
# 查看修改后的变量值,起作用了
p StCfg::dumpQuoteClock
# 连续单步执行,可以确认进入到dump quote的函数,实际生成了文件。
next
# 停用断点
disable 1
# 分离进程
detach
# 退出gdb
quit
事后想想,其实也可以不修改变量,在断点停住后,通过jump(j)命令,直接跳转到要执行的代码位置开始执行也是一招。