1

私がこれらの機能を持っているとしましょう

void foo(int a, int b, int c);
void bar(int d);
void start();

そして、私はこのようなコアダンプを取得します

foo(<value of a>, <value of b>, <value of c>, <three garbage values>)
bar(<value of d>, <five garbage values>)
start(<six garbage values>)
.... [other functions]

それで、fooと呼ばれるbarと呼ばれるものを開始し、fooでクラッシュしました。問題は、スタック内のこれらの値が、各関数が呼び出されたときの%o1、..、%o5レジスタの値をトレースしているのか、それともその時点での%i0、..、%i5レジスタの値であるのかということです。クラッシュの原因(関数がこれらの入力レジスタの1つを変更した場合、スタックトレースの値が異なることを意味します)?

私が尋ねる理由は、それが出力レジスタの値だと思ったのですが、顧客が最近ハードウェアをアップグレードし、スタックトレースの引数の1つに誤りがあるように見えるコアダンプを持っているためです。呼び出し元の逆アセンブリは正しく見えます。その特定の引数を設定するために使用されたレジスターでさえ、通常の型の不一致、符号付き/符号なしなどをチェックしました。

4

1 に答える 1

0

スタックトレースは通常、すべての呼び出しのスタックフレームのダンプを示します(トートロジーはご容赦ください)。関数パラメーターの後には、戻りアドレス、前のスタックフレームへのポインターなどが続きます。これらはごみの値です。スタックレイアウトの正確な詳細については、「AIX呼び出し規約」のようなものをグーグルで検索できます。コアダンプが生成されると、関数が呼び出されたときのスタック上の値を知ることはできません。クラッシュ時の値が表示されます。したがって、関数が正式なパラメーターに新しい値を割り当てるか、バグ(スタック上のバ​​ッファーのオーバーフローなど)が原因でパラメーターが上書きされた場合、値は呼び出し時の値とは異なります。

于 2013-03-19T21:53:34.000 に答える