如何编写一个简单的调试器?

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

请你简单阐述用C语言编写一个模块化程序的基本过程

如何在 React 中调试一个简单的 API

启用Gradle远程调试

如何在 Excel 2016 中调试一个简单的 vba 函数?

调试简单的Ping-Pong游戏?