GNU/Linux Tips
来自Jack's Lab
(版本间的差异)
(→Mounting partition from VDI image) |
|||
| 第31行: | 第31行: | ||
$ VBoxManage clonehd /work/FreeDos.vdi /work/freedos.vdi --format VDI --variant Fixe | $ VBoxManage clonehd /work/FreeDos.vdi /work/freedos.vdi --format VDI --variant Fixe | ||
</pre> | </pre> | ||
| + | |||
| + | <br><br> | ||
| + | |||
| + | == GDB Tips == | ||
| + | |||
| + | 1. 查看寄存器 | ||
| + | |||
| + | <pre> | ||
| + | (gdb) i r | ||
| + | (gdb) i r a # 查看所有寄存器(包括浮点、多媒体) | ||
| + | (gdb) i r esp | ||
| + | (gdb) i r pc | ||
| + | </pre> | ||
| + | |||
| + | |||
| + | 2. 查看内存 | ||
| + | |||
| + | <pre> | ||
| + | (gdb) x /wx 0x80040000 # 以16进制显示指定地址处的数据 | ||
| + | (gdb) x /8x $esp | ||
| + | (gdb) x /16x $esp+12 | ||
| + | (gdb) x /16s 0x86468700 # 以字符串形式显示指定地址处的数据 | ||
| + | (gdb) x /24i 0x8048a51 # 以指令形式显示指定地址处的数据(24条) | ||
| + | </pre> | ||
| + | |||
| + | |||
| + | 3. 修改寄存器的值 | ||
| + | |||
| + | <pre> | ||
| + | (gdb) set $v0 = 0x004000000 | ||
| + | (gdb) set $epc = 0xbfc00000 | ||
| + | </pre> | ||
| + | |||
| + | |||
| + | 4. 修改内存的值 | ||
| + | |||
| + | <pre> | ||
| + | (gdb) set {unsigned int}0x8048a51=0x0 | ||
| + | (gdb) set *(unsigned int*)0x8048a54=0x55aa55aa | ||
| + | </pre> | ||
| + | |||
| + | |||
| + | 5. 内存搜索 | ||
| + | |||
| + | <pre> | ||
| + | Usage: find <start> <end> <count> <value> | ||
| + | |||
| + | (gdb) define find | ||
| + | set $ptr = $arg0 | ||
| + | set $cnt = 0 | ||
| + | while ( ($ptr<=$arg1) && ($cnt<$arg2) ) | ||
| + | if ( *(unsigned int *)$ptr == $arg3 ) | ||
| + | x /wx $ptr | ||
| + | set $cnt = $cnt + 1 | ||
| + | end | ||
| + | set $ptr = $ptr + 4 | ||
| + | end | ||
| + | end | ||
| + | </pre> | ||
| + | |||
| + | |||
| + | 6. 断点、监测点 | ||
| + | |||
| + | <pre> | ||
| + | (gdb) b *0x80400000 | ||
| + | (gdb) watch *(unsigned int *)0xbffff400==0x90909090 | ||
| + | </pre> | ||
| + | |||
| + | <br><br> | ||
2013年8月16日 (五) 19:00的版本
1 Mounting partition from VDI image
$ od -j344 -N4 -td4 /work/FreeDos.vdi | awk 'NR==1{print $2;}'
8192
$ sudo losetup -f --show -o 8192 /work/FreeDos.vdi
/dev/loop0
$ sudo fdisk -lu /dev/loop0
Disk /dev/loop0: 113 MB, 113246208 bytes
16 heads, 63 sectors/track, 219 cylinders, total 221184 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/loop0p1 * 63 1023119 511528+ 6 FAT16
$ sudo mount -o loop,offset=$((512*63)) /dev/loop0 /mnt
$ ls /mnt/
AUTOEXEC.BAT BOOTSECT.BIN COMMAND.COM FDCONFIG.SYS FDOS KERNEL.SYS
$ sudo umount /mnt
$ sudo losetup -d /dev/loop0
$ VBoxManage clonehd /work/FreeDos.vdi /work/freedos.vdi --format VDI --variant Fixe
2 GDB Tips
1. 查看寄存器
(gdb) i r (gdb) i r a # 查看所有寄存器(包括浮点、多媒体) (gdb) i r esp (gdb) i r pc
2. 查看内存
(gdb) x /wx 0x80040000 # 以16进制显示指定地址处的数据 (gdb) x /8x $esp (gdb) x /16x $esp+12 (gdb) x /16s 0x86468700 # 以字符串形式显示指定地址处的数据 (gdb) x /24i 0x8048a51 # 以指令形式显示指定地址处的数据(24条)
3. 修改寄存器的值
(gdb) set $v0 = 0x004000000 (gdb) set $epc = 0xbfc00000
4. 修改内存的值
(gdb) set {unsigned int}0x8048a51=0x0
(gdb) set *(unsigned int*)0x8048a54=0x55aa55aa
5. 内存搜索
Usage: find <start> <end> <count> <value>
(gdb) define find
set $ptr = $arg0
set $cnt = 0
while ( ($ptr<=$arg1) && ($cnt<$arg2) )
if ( *(unsigned int *)$ptr == $arg3 )
x /wx $ptr
set $cnt = $cnt + 1
end
set $ptr = $ptr + 4
end
end
6. 断点、监测点
(gdb) b *0x80400000 (gdb) watch *(unsigned int *)0xbffff400==0x90909090