1

JITの出力を処理する必要があるトレースツールを作成しているので、スタックがかなり奇妙に見えることがあります。いくつかのヒューリスティックをアドレスに適用して、それらがコード、データ、またはガベージであるかどうかを判断してみたいと思います。(私が時々間違っている場合、それは大したことではありませんが、プロセスがクラッシュした場合、それほど多くはありません。)

cat /proc/«pid»/mapsLinuxのプロセスのVMマッピングのリストを取得できます。そのファイルを解析せずに、プロセス内からこの情報(または任意のサブセット)にアクセスすることは可能ですか?rwxアドレスのビットを調べるのが理想的です。基本的に、の「読み取り」バージョンが必要ですmprotect(2)

これができない場合、特定のアドレスへのアクセスがセグメンテーション違反を引き起こすかどうかを判断するのはどうですか?(この場合、すでにSIGSEGVハンドラーがインストールされているので、簡単に上書きすることはできません。または、それを実行するだけです。)

4

1 に答える 1

2

私が発見したすべてのメモリ関連の関数をmunlock()調べて、ページが有効かどうかを判断するために使用できます。

bool is_address_valid(ADDRINT addr) {
  static int pagesize = getpagesize();

  const void *foo = (const void *)(addr / pagesize * pagesize);

  if (munlock(foo, 1) == -1) {
    fprintf(stderr, "munlock(%p=>%p, 1) failed: %s\n", addr, foo,
            strerror(errno));
    return false;
  }
  return true;
}

かなり嫌ですが、それは私のコードがクラッシュするのを防ぎます。

于 2008-10-12T02:25:08.440 に答える