実行時に呼び出される関数を印刷するツール?

実行時に呼び出される関数を印刷するツール?

私はUnix / Linuxプラットフォームで次のことを行うためのツールを探しています。

  1. ソースファイルがあり、アプリケーションを直接コンパイルしました(ソースコードはCになっていますが、それは重要ではないと思います)。
  2. すべての関数呼び出しをstdout /ファイルに印刷/ログに記録してこのアプリケーションを実行したいと思います。

たとえば、

#include <stdio.h>
int square(int x) { return x*x; }
int main(void) {
    square(2);
}

このプログラムを実行すると印刷されます。

  • 基本
  • 正方形

私はgdbこれをある程度行うことができることを理解しています。valgrindそうでなければ、それらのどれも私が望むものを正しく実行しません。そのようなツールが存在するかどうか疑問に思います。ありがとうございます。

ベストアンサー1

実行可能ファイルが呼び出されたときに関数名を印刷するには、GNUシステムで「gccオプション」-finstrument-functionsを使用してdladdr()アドレスを関数名に変換できます。

いいねを作るinstrument.c

#define _GNU_SOURCE
#include <dlfcn.h>

#include <stdlib.h>
#include <stdio.h>

#define TRACE_FD 3

void __cyg_profile_func_enter (void *, void *)
   __attribute__((no_instrument_function));

void __cyg_profile_func_enter (void *func,  void *caller)
{
  static FILE* trace = NULL;
  Dl_info info;

  if (trace == NULL) {
    trace = fdopen(TRACE_FD, "w");
    if (trace == NULL) abort();
    setbuf(trace, NULL);
  }
  if (dladdr(func, &info))
    fprintf (trace, "%p [%s] %s\n",
             func,
             info.dli_fname ? info.dli_fname : "?",
             info.dli_sname ? info.dli_sname : "?");
}

その後、実行可能ファイルは次のようにコンパイルされます。

$ gcc -O0 -rdynamic -finstrument-functions square.c instrument.c -ldl
$ ./a.out 3>&1
0x400a8f [./a.out] main
0x400a4f [./a.out] square

(ここではfd 3を使用して関数名をダンプし、stdoutストリームとstderrストリームとは別に保持します)。

dli_sname関数名のみが必要な場合は、印刷用にのみコードを調整できます。

おすすめ記事