回到首页



PCSX 调试器使用说明
last updated at 2006-07-20
===========================

       


===========
0. 说明
===========


. 本调试器改自PCSX,感谢PCSX Team。调试器作者Agemo,开源。

===========
1. 配置
===========


. 插件与BIOS都可以用epsxe模拟器的。插件推荐配置
 显示:pete soft,窗口分辨率400x300
 声音:no sound。不然在断点时声音很难听
 键盘:Segu Direct Input Keyboard,非当前窗口也可以输入,有特殊作用。

. 必须在PCSX菜单 configuration->CPU 勾上 Enable Interpreter Cpu
 这样所有的debug功能才会生效,否则基本上所有调试功能都无效。
 会比正常模拟器慢些,赛扬733约30帧,AMD2800+是60帧以上,做debug足够了。
 如果某一时候想快点运行模拟器,不加载debugger,可以先取消这个选项

===========
2. 功能列表
===========


. pause/resume CPU
 暂停/继续PS CPU执行。
 
 【注意】后面多数功能一般要暂停cpu后才能用

. Dump
 将各种存储写入文件。见dump目录。
 内存(ram.bin),显存(vram.bin),BIOS(bios.bin),

 【注】此项功能要在cpu暂停的状态下才能执行。

. Load
 加载dump下来的ram.bin(其他如显存等不加载)

 debugger本身不支持方便的内存编辑功能,而是提供了一个dump/load方式,
 这样各人可用自己习惯的编辑工具(比如我用Winhex)来修改内存。
 
. ASM Log
 将CPU执行过的指令(反汇编形式)写入文件 asm.txt
 
 一般这个功能是和其他功能搭配使用的. 不然生成的log巨大

 Clear按钮是清空log文件
 程序启动时,log文件也会被清空
 
. Break on pc =
 指令断点,在右方的文本框输入指令地址
 当CPU执行到这个地址的时候,PS CPU就会中断

 输入的地址都是十六进制格式,如果不满8位,会自动补齐头
 下面的信息栏会有相关信息显示如:wait for pause on pc 80003C5D
 
 【注】改动有检查框的值,要先取消选中、再勾上才能有效。下同。

. Break on Mem Write
 监视PS内存的写操作。当指定区域内的数据被改写之后,发生中断
 后面的两个文本框分别是内存地址范围的上下界
 可以用来监视写入内存任意地址的指令。
 但不能监视比如读光驱的操作(这个是DMA)。检测光驱读后面有介绍。

. Break on Mem Read
 监视PS内存的读操作。类似上面的

. Break on Mem address = value
 当某内存地址的值等于指定的值时,发生break
 注意value目前只支持单字节。

. Exec To / Exec
 指令执行到
 
 这一行最左的只读文本框的值是,当前总计已执行指令条数。
 (在读取即使存档后、或者从菜单run cd会自动清0)

 跟着的文本框含义:
 对于Exec To按钮:是总指令计数器到多少时中断

 对于Exec按钮是指令往下执行多少条后中断。
 其中,如果exec 1条指令就等于单步跟踪。
 
 此功能配合模拟器的save/load进度,用于非常重要的【回溯指令法】。
 见下面的解释。

. ] VRAM 查看器
 查看VRAM的内容,可切换各种模式显示,支持CLUT。
 见DUMP目录下的vram.exe

. GPU Upload break
 内存->显存 数据传输时候中断。
 所有的材质要显示之前都要从内存DMA传输到显存,相当有用的功能。
 可以追踪显存里材质的来源

. GPU Chain break
 这个就是把当前一次绘图的原语(prims)记录到 gpu.log
 gpu.log 里面每行的格式是
      0CED74:48 - F3 (87, 130)-(87, 146)-(163, 146) RGB( 0, 40, 0)
 0CED74: prim在内存地址
 48  : prim类型
 后面的是解释。F3就是画三角形,一般游戏字体输出是用 sprite 原语
 
 屏幕上所有的东西都是由原语(prims)画出来的。因此这个功能用于修改游戏的界面,
 比如FF2汉化版把8x8小字体改为10x10,界面布局的修改全是靠这个完成的。
 更多关于prims的资料,参见文档 gpu.txt

. CDROM Read monitor
 就是光碟扇区读监视,读光驱发生中断
 信息显示格式解释:
 cdrom $80045800 <- 64:53:06($473f7), 2048 bytes
 $800B88E0 读入的内存地址
 64:53:06 光碟的位置(用 分钟,秒,扇区格式表示)
 $473f7  光碟的位置,绝对扇区号,十六进制。乘以十进制2352就是对应iso的扇区偏移
 2048 bytes 读入的字节数。一般是一个扇区,就是2048字节
 
 注意,一个扇区的$18偏移开始的2048字节是数据,见光碟扇区格式的文档。
 
. SPU Upload Bread
 如果有数据上传至SPU内存,则中断
 
. align check
 内存读写对齐检查(lh指令2对齐、lw指令4对齐)。
 不对齐的地址在模拟器上没事,但PS上会死机。用于检查PS兼容性

=============
3. 例子
=============


. 修改PS内存中的值
  pause cpu->dump
 
  用winhex编辑dump\ram.bin
  文件偏移0 直接对应内存地址 0x80000000

  改好了load -> resume cpu
 
  注意:一般来说,在dump以后不能执行一些指令后再load。
  因为是完全重读入整个内存,执行一些指令后很多数据都不一致了,特别是栈。
  另外,此功能和模拟器的 即时存档 配合非常有用。

. 监测内存读、写
  1. 填写好监测地址范围,然后打勾 mem read

  2. 如果指定区域内存发生了读、写操作,cpu会中断
  pause cpu按钮上的文字也会变为 resume cpu(说明现在是中断)
  这时候可以做dump/load,单步跟踪之类的配合操作
 
  * 注意,修改了文本框的监测范围、指令断点等值,
  要先去掉对应的勾、再勾上,这样才能生效。在下方信息窗也可以看到提示信息。

. 指令回溯

  指令回溯相当重要。比如触发了一段内存写操作,但不知道前面执行了什么
  为什么会跳转到这里,所以需要用回溯功能. 回溯就是找到以前都执行了什么指令
 
  方法是利用模拟器本身的即时存档、读档 + 总指令计数器

  比如
  1. 模拟器即时存档后读档 (让总指令计数器清0)
  2. break on mem write
  3. 记下总指令的数字
  4. 模拟器读档 (再次让总指令计数器清0)
  5. 然后用 exec(就是执行多少条指令)执行到前面去。

  此功能可以配合 asm log

. Segu键盘插件
  用Segu键盘插件也有一个好处,就是非当前窗口也可以输入。
  比如,游戏按了某键然后读入下面文本,就可以这么中断:
  1. 模拟器即时存档后读档 (让总指令计数器清0)
  2. break on mem read
  3. 按住键
  4. resume cpu执行,会发生中断
 

 
. asm log 的使用技巧
 
  比如在日志中一条写入你监视地址的指令,想查找前面是哪里写入的:
  80014934 : LW 00040000 (a0), c724 (00040000 (v0)) [0003c724]
  后面的 [80067c01] 就是此指令操作的内存地址最终换算结果

  UltraEdit 双击这个 80067c01 选中,然后Ctrl-F3 向前查找
  会查到这个内存地址是前面哪条指令写入的。
  (如果查不到,说明指令太早了,没log下来,考虑用break on mem write跟踪)


 总之各个功能配合起来,一起使用才是正道。这里不再多举例子。


=============
4. 已知的问题
=============


. 内存读写不监视DMA操作。
 如果发现内存被改写,而break mem write无效,这应该就是cdrom读入的数据
 用cdrom监视。
 
. 在asm反汇编窗口看到的指令,在单步调试时,在指令跳转时可能有少量错误
 解决方法是用ASM Log的功能。ASM LOG下来的数据都是正确的