ブログ

Segmentation fault時のレジスタを表示する方法

at_shiita.ishigaki
2021年10月5日 8時46分

メモリ違反を意図的に起こすために以下のプログラムを用意します。

int main(void){
    int *a = 0;
    *a = 0;
    return 0;
}

Segmentation fault時のレジスタを表示するにはcatchsegvコマンドを実行します。
※ここでは上記のプログラムをコンパイルしたものをa.outとしています。

[armadillo ~]# catchsegv ./a.out
Segmentation fault
*** Segmentation fault
Register dump:
 
 R0: 00000001   R1: bed2ad84   R2: 00000000   R3: 00000000
 R4: bed2ac48   R5: 00000000   R6: 00000000   R7: bed2ac20
 R8: 00000000   R9: 00000000   SL: 00505000   FP: 00000000
 IP: bed2acb0   SP: bed2ac20   LR: b6e8d4ab   PC: 004f45b2
 
 CPSR: 60070030
 
 Trap: 0000000e   Error: 00000805   OldMask: 00000000
 Addr: 00000000
 
Backtrace:
 
Memory map:
 
004f4000-004f5000 r-xp 00000000 b3:02 14479 /root/a.out
00504000-00505000 r--p 00000000 b3:02 14479 /root/a.out
00505000-00506000 rw-p 00001000 b3:02 14479 /root/a.out
0139c000-013c1000 rw-p 00000000 00:00 0 [heap]
b6e4e000-b6e66000 r-xp 00000000 b3:02 1173 /lib/arm-linux-gnueabihf/libgcc_s.so.1
b6e66000-b6e75000 ---p 00018000 b3:02 1173 /lib/arm-linux-gnueabihf/libgcc_s.so.1
b6e75000-b6e76000 r--p 00017000 b3:02 1173 /lib/arm-linux-gnueabihf/libgcc_s.so.1
b6e76000-b6e77000 rw-p 00018000 b3:02 1173 /lib/arm-linux-gnueabihf/libgcc_s.so.1
b6e77000-b6f50000 r-xp 00000000 b3:02 1354 /lib/arm-linux-gnueabihf/libc-2.24.so
b6f50000-b6f5f000 ---p 000d9000 b3:02 1354 /lib/arm-linux-gnueabihf/libc-2.24.so
b6f5f000-b6f61000 r--p 000d8000 b3:02 1354 /lib/arm-linux-gnueabihf/libc-2.24.so
b6f61000-b6f62000 rw-p 000da000 b3:02 1354 /lib/arm-linux-gnueabihf/libc-2.24.so
b6f62000-b6f65000 rw-p 00000000 00:00 0
b6f65000-b6f67000 r-xp 00000000 b3:02 1304 /lib/arm-linux-gnueabihf/libSegFault.so
b6f67000-b6f76000 ---p 00002000 b3:02 1304 /lib/arm-linux-gnueabihf/libSegFault.so
b6f76000-b6f77000 r--p 00001000 b3:02 1304 /lib/arm-linux-gnueabihf/libSegFault.so
b6f77000-b6f78000 rw-p 00002000 b3:02 1304 /lib/arm-linux-gnueabihf/libSegFault.so
b6f78000-b6f90000 r-xp 00000000 b3:02 1196 /lib/arm-linux-gnueabihf/ld-2.24.so
b6f9d000-b6f9f000 rw-p 00000000 00:00 0
b6f9f000-b6fa0000 r--p 00017000 b3:02 1196 /lib/arm-linux-gnueabihf/ld-2.24.so
b6fa0000-b6fa1000 rw-p 00018000 b3:02 1196 /lib/arm-linux-gnueabihf/ld-2.24.so
bed0a000-bed2b000 rw-p 00000000 00:00 0 [stack]
bef5b000-bef5c000 r-xp 00000000 00:00 0 [sigpage]
ffff0000-ffff1000 r-xp 00000000 00:00 0 [vectors]

また、以下のようにcatchsegvコマンドの引数にファイル名のみを与えた場合はエラーとなります。

[armadillo ~]# catchsegv a.out
/usr/bin/catchsegv: 58: /usr/bin/catchsegv: a.out: not found