【问题标题】:GDB: Re-run program until it faults, answering prompts along the wayGDB:重新运行程序直到它出现故障,沿途回答提示
【发布时间】:2016-10-10 09:42:03
【问题描述】:

问题


我试图让 自动调试我正在审查的 程序,其中有一个小但真实的机会(即:10,000 机会中的一个)由于已知的漏洞。我与另一位工程师争辩说它足够严重,可以解决,所以我需要实际导致崩溃发生,以证明花时间修复它是合理的。为了加快测试速度,我计划编写一个脚本,让应用程序在 GDB 中运行几天(如果需要),直到它崩溃。


先前的研究


I've found out how to run simple applications through GDB until segfaulting via a separate answer on StackOverflow,但我需要稍微扩展一下问题。所以,我知道我可以反复运行一个程序,直到它通过以下方式崩溃:


set pagination off
break exit
commands
run
end

问题


我需要做的是弄清楚如何发出某些命令。在我的程序运行几秒钟后,它会要求用户输入(通过stdin[0,100] 范围内的一个数字,然后点击ENTER。我希望它在第一次迭代时输入0,ENTER,在第二次迭代时输入1,ENTER,等等。我意识到这会很重要如果我向应用程序添加命令行参数会更容易,但此时我不能更改它,必须依赖它提供的交互操作模式。


问题


如何使用 GDB 创建一个命令来自动生成这些击键/模式?我猜我可以编写某种GDBINIT 脚本,但我主要以交互方式使用 GDB 来获取回溯、分析内存等,并且不太熟悉此类自动化任务。

谢谢。

【问题讨论】:

  • 请感谢 :)
  • 如果程序只是从stdin读取,你为什么不直接重定向一个文件呢?

标签: gdb c c linux debugging gdb gdbinit


【解决方案1】:

因为您的程序从stdin 读取其输入,所以您的任务很简单。只需按如下方式创建输入文件:

1
2
3
...

然后,您的 gdb 命令序列将其 run 阶段更改为包含输入文件(例如 input.txt):

set pagination off
break exit
commands
run < input.txt
end

【讨论】:

  • 谢谢。最后一个问题:是否可以对输入进行有条件的更改?即:如果程序的控制台输出中出现了某行文本,要开始使用不同的输入数据集,还是直接跳转到100作为输入值?另外,我可以告诉它继续重复使用 input.txt 吗?
  • 这要困难得多。在这里,您必须有一个与程序通信的智能脚本来提供输入和读取输出
  • 再次感谢。这帮助很大!
猜你喜欢
  • 2011-09-26
  • 2015-05-05
  • 2022-01-14
  • 2022-07-16
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 2010-11-16
相关资源
最近更新 更多