-4

いくつか質問があります:

  1. int backtrace(void **buffer, int size); ここで buffer はポインタの配列です。戻り値の配列要素は、スタックの各フレームへのポイントを返します。では、backtrace() は内部で malloc() をフレーム数の回数だけ呼び出すのでしょうか? これはなぜですか?
  2. 上記の割り当てられたメモリは backtrace() から freed() されていません。では、このメモリを解放するのは誰でしょうか?
  3. backtrace() 内から malloc() を回避する方法はありますか?
  4. backtrace() のソース コードはどこにありますか?
  5. アセンブリでバックトレースするコードを書くにはどうすればよいですか?
4

2 に答える 2

4

backtrace のマニュアルページをもう少し注意深く読んでください。あなたはいくつかの基本について間違っているようです:

  1. いいえ、ポインタarrayのバッファです。スタック フレームを指すために埋められます。backtrace()への呼び出しmalloc()は行われません。
  2. あなた、あなたの記憶だから。
  3. 適用外、backtrace()呼び出しませんmalloc()
  4. これは GNU libc の一部です。これは実装の一部です。
  5. おそらく、スタック ポインターをコピーし、手動でスタックをウォークすることによって。

と混同backtrace()しているようですがbacktrace_symbols()、後者にはメモリ割り当てが含まれます。

現在のバックトレースを最大 64 レベルまで読み取るには、次のようにします。

void *stack[64];
const int depth = backtrace(stack, sizeof stack / sizeof *stack);
于 2012-01-04T09:56:06.637 に答える