-1

プロファイラー内を指す変数を介して、malloc された領域の使用状況を追跡しようとしています。たとえば、関数 func() 内の次の代入の場合。

uint64_t *   dictionary = (uint64_t *) malloc(sizeof(uint64_t)*128);

malloc されたメモリ領域を指す変数名 (上記の例では「辞書」) を把握する必要があります。malloc() を実装して、割り当ての開始アドレスとサイズを記録しました。ただし、変数「辞書」の知識はまだありません。私が考えているのは、関数 func() のスタック フレームを調べて、malloc された型と一致するデータ型を指すローカル ポインター変数を見つけることです。このアプローチでは、malloc() をインストルメント化し、1 フレーム戻って func() に戻り、可能なローカル変数を見つけてから、型によるファジー マッチを行う必要があります。これを実装する他のきちんとした方法があるかどうか疑問に思っています。

4

1 に答える 1

2

一般的に、これは不可能だと思います。:)

  • もちろん、変数が利用可能であると仮定することはできません。一般的に最善の策は、呼び出し元の関数のフレームのスタック オフセットです。ただし、デバッグ シンボルが使用可能な場合は、それを名前にマップできる可能性があります。
  • 名前がない可能性もあると思います。リターンアドレスがレジスタに入れられ、おそらくそこで操作されてから、(もしあれば)メモリに書き込まれます。これが、コードが呼び出し元のコードの分析を開始して、戻り値で何を行うかを追跡する必要があることを意味する場合、それは難しいように思えます。

変数参照を分離したら、その変数参照をどうしたいですか? デバッグ目的でインストルメントmalloc()化していると思われるので、おそらくどこかに保存するでしょう。

于 2013-11-05T08:47:08.347 に答える