スタックのダンプ

ちと覗いてみた。

#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して、配列の範囲内ならばマークとか。むぅ。考えることが大量だ。


スタックの中を走査するのは危険な香りが満載過ぎる。じっくり考えてみる。