如何编写一个简单的调试器?
Posted
技术标签:
【中文标题】如何编写一个简单的调试器?【英文标题】:How to write a simple debugger? 【发布时间】:2011-04-18 11:15:59 【问题描述】:我想将我编译的目标代码连接到 c++ 代码,然后检查是否执行了某行代码。 这两件事怎么做?
如果解释不简单(我敢打赌不是),至少有人可以指出一些解释如何做到这一点的网页吗?
我了解不同平台的解决方案是不同的,但我对如何在 windows 和 linux 上完成它很感兴趣(首先是 linux)
【问题讨论】:
为什么不直接使用现有的调试器? @Erik 我知道调试器非常复杂,我对创建一个不感兴趣。我只想收集有关如何检查在执行过程中执行了哪些方法/函数以及执行了多少次的信息。 这是什么“编译目标代码”?根据您的控制级别,它可能就像在您想了解的代码行之前/之后添加一个 printf() 语句一样简单。或者,您可能想研究如何在您选择的平台上覆盖函数(有时称为 swizzling)。在许多平台上,您可以用自己的函数替换链接器表中的函数条目,执行 printf,然后调用原始函数。在最坏的情况下,您也可以用跳转指令替换函数的第一条机器指令。 【参考方案1】:如果你想知道它是怎么做的,
gdb 是开源的ptrace
syscall 应该可以帮助您入门,
libunwind-ptrace
this is a nice article 使用 ptrace
【讨论】:
【参考方案2】:我怀疑您实际上并不需要调试器而是分析器。我喜欢http://valgrind.org/docs/manual/cl-manual.html 的 callgrind,http://kcachegrind.sourceforge.net/ 有一个很好的图形环境。
我会尝试使用
$ valgrind --tool=callgrind ./myapp
$ kcachegrind callgrind.out.xxx
【讨论】:
这不是我真正想要的,但 valgrind 是开源的。所以,谢谢你的提示:)【参考方案3】:在您的评论中,您说“我只想收集有关如何检查在执行期间执行了哪些方法/函数以及执行了多少次的信息”。
如果这是您想要实现的目标,请使用诸如 gprof 之类的分析器。
使用 -g -pg 编译您的程序,当您的程序完成时,它会创建一个文件,gprof 可以处理该文件以显示您想要的内容。
【讨论】:
对,但我想从我的应用程序中执行此操作 - 无需编译库或带有其他选项的程序(-pg 用于 gcc)。以上是关于如何编写一个简单的调试器?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Visual Studio 2012的C++编写DLL