xtang,问个关于调试工具的问题

目前调试工具的接口是否开放啊?比如是否提供进行单步执行的API函数,让自己设计的应用程序也具备调试功能呢?

是开放的吧

去找GDB的源代码

找GDB源码不能解决一切问题,毕竟目标系统不同。

我在qnx的ftp上看见过 一份qnx4下的代码,写的很粗糙。
关于qnx4下的调试器我也想过很多办法。多数情况下我都是无源码调试,qnx4下的wd很烂,经常出错并且连汇编代码都解码不正确。
后来尝试过bochs,用他感觉还不错,当初在断点问题上折磨我好久。后来搞清楚qnx4的程序堆栈分配方式后就容易多了。可惜我现在还没办法做到用bochs来识别其中的系统函数信息,调试起来还是有点麻烦。
qnx6下我没做过,不过你可以看看ida的sdk,里面有一些资料是关于linux下的,ida有一个linux下的调试器,不知道是否可以参考他写一个。
至于gdb,那东西太大,不是做研究,为了解决一个技术问题去吃透它,不值。

接口肯定有,gdb能做,你的程序肯定也能做。

这个接口没有落文档,恐怕是因为会随着版本变化吧。但如果你要做,可以去 Core OS看看
services/system/pathmgr/procfs.c

主要是里面的 DCMD_PROC_* 控制。应该有帮助。像你说的单步执行,应该就是一个DCMD_PROC_RUN命令,加上传进去的信息块里有个FLAG说是单步。

具备调试功能,大概具备下面这些功能的API是一定需要的:
1、调试进程初始化部分
a、创建调试进程
b、附加进程
c、等待调试事件
2、断点设置
a、int3或者jmp方法设置断点,需要读写调试进程内存
b、内存断点设置,可能需要设置内存读写属性的API
c、硬件断点,需要有读写Dr0–Dr7寄存器的API
3、执行程序
a、不管是步过还是单步,步入等,都需要读Eflag,或者至少需要操作追踪标志TF来进入单步。
b、函数名解析,如果不解析,看到的函数就是一堆地址,可读性很糟糕,关于这个地方可能没有相关的API,但是可以自己做,不是太难。
c、运行记录,一般调试器,需要堆栈,函数调用,寄存器等记录

其中1,2和3中的a是一定需要的,如果有这些API,那应该没什么问题。
对了,还有一个,就是对调试代码的反汇编,这个有现成的库可以用,另外还需要一些对QNX下可执行文件结构的说明,例如QNX下elf或者lmf的结构表,便于反汇编和确定入口等。

不知道QNX是否有类似的API方便用。

我在捣腾了bochs代码后调试qnx4应用程序的截图