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下来的数据都是正确的
|