スタックのダンプ
ちと覗いてみた。
#include <stdio.h> void *stack_bottom; void display_stack(void) { void *p; int dummy = 0x5678; void *stack_top = (void *) &dummy; printf("stack_bottom : %p\n", stack_bottom); printf("stack_top : %p\n", stack_top); printf("stack_size : %d(%d)\n", stack_bottom - stack_top + 4, (stack_bottom - stack_top + 4) / 4); printf("stack_dump : \n"); for(p = stack_top; p <= stack_bottom; p += 4) printf("%p %#x\n", p, * (int *) p); } int main(void) { int dummy = 0x1234; stack_bottom = (void *) &dummy; display_stack(); return 0; }
もっと根っこから見たい場合はargvとかを登録しとくといい感じ。
void *のポインタ演算は1バイトづつだった。後で調べる。
実行してみると。
stack_bottom : 0x22cce4 stack_top : 0x22ccc0 stack_size : 40(10) stack_dump : 0x22ccc0 0x5678 0x22ccc4 0x22ccc4 0x22ccc8 0x22cce8 0x22cccc 0x40114d 0x22ccd0 0x6116bd3a 0x22ccd4 0x2f 0x22ccd8 0x40110f 0x22ccdc 0x401134 0x22cce0 0x10 0x22cce4 0x1234
おぉ。スタックの中が見えた。
ついでに
レジスタのダンプ。
setjmpを悪用利用する。
#include <stdio.h> #include <setjmp.h> void display_register(void) { int i; jmp_buf reg; setjmp(reg); for (i = 0; i < sizeof(jmp_buf); i += 4) printf("%p %#x\n", (void *) reg + i, *(int *)((void *)reg + i)); } int main(void) { display_register(); return 0; }
実行すると。
0x22cbe0 0x22cbe0 0x22cbe4 0 0x22cbe8 0x1 0x22cbec 0x61102edc 0x22cbf0 0x611021a0 ...いっぱい
わぁお。レジスタの内容まで覗けちゃった。
レジスタの大きさが32ビットだとは限らないので問題アリだけど、setjmpは使える!!
考え中
さてと。どうやってマークすればいいのか考えなくては・・・闇雲にマークしたら大変なことになっちゃうからなぁ。
配列でmallocして、配列の範囲内ならばマークとか。むぅ。考えることが大量だ。
スタックの中を走査するのは危険な香りが満載過ぎる。じっくり考えてみる。