• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現に関する質問)

正規表現に関する質問

このQ&Aのポイント
  • C言語のソースコードで関数の先頭にprint文を追加する方法について教えてください。
  • 横になる返り値や複数行にわたる引数の扱い方について知りたいです。
  • 以前の質問をヒントにした結果、うまくいかないケースが多々あります。どのような方法があるか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

表示がずれるので、空白2文字を全角空白にしていることに注意 #define _GNU_SOURCE #include <stdio.h> #include <string.h> #ifndef __CYGWIN32__ #include <dlfcn.h> #endif /* BINARY HACKS P.300 */ /* 関数への enter/exit をフックする */ #ifndef __CYGWIN32__ __attribute__((no_instrument_function)) void addr2name(void *func_address, char *func_name) {   Dl_info dli;   if (0 != dladdr(func_address, &dli)) {     strcpy(func_name, dli.dli_sname);   }   else {     strcpy(func_name, "");   } } #endif __attribute__((no_instrument_function)) void __cyg_profile_func_enter(void *func_address, void *call_site) {   extern void *__libc_stack_end;   char     func_name[256];   int     stack_size;   void    *frame = __builtin_frame_address(1) + 8; #ifndef __CYGWIN32__   addr2name(func_address, func_name);   stack_size = __libc_stack_end - __builtin_frame_address(0); #else   strcpy(func_name, "");   stack_size = 0; #endif   printf("enter %s:%p, from=%p stack size=%d\n",       func_name, func_address, call_site, stack_size); } __attribute__((no_instrument_function)) void __cyg_profile_func_exit(void *func_address, void *call_site) {   char func_name[256]; #ifndef __CYGWIN32__   addr2name(func_address, func_name); #else   strcpy(func_name, ""); #endif   printf("exit %s:%p, from=%p\n", func_name, func_address, call_site); } void sub_func(int arg1, char arg2, char *arg3) { } void func(int arg1, char arg2, char *arg3) {   sub_func(arg1, arg2, arg3); } __attribute__((no_instrument_function)) void func_no_instrument_function(int arg1, char arg2, char *arg3) { } __attribute__((no_instrument_function)) int main(int argc, char *argv[]) {   int  arg1 = 10;   char arg2 = 20;   char *arg3 = "abc";   printf("sub_func = %p\n", sub_func);   printf("func = %p\n", func);   func(arg1, arg2, arg3);   func_no_instrument_function(arg1, arg2, arg3);   return 0; } /* $ gcc -g -finstrument-functions -rdynamic foo.c -o a.out -ldl && ./a.out */ /* sub_func = 0x804891e */ /* func = 0x8048952 */ /* enter func:0x8048952, from=0x8048a13 stack size=264 */ /* enter sub_func:0x804891e, from=0x804898b stack size=312 */ /* exit sub_func:0x804891e, from=0x804898b */ /* exit func:0x8048952, from=0x8048a13 */

noname#182748
質問者

お礼

回答ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

http://okwave.jp/qa/q6954461.html のつづきでしょうか? 真面目にやろうとすると、C言語の構文解析プログラムになり、かなり面倒です。 簡潔にしたかったら、整形ツール(astyle, uncrustify等)で書式を整え、一定の規則(引数はかならず開き括弧と別の行、とか、定義の開始の{はかならず行頭、とか)にそろえてから、その規則に従った正規表現にするのがいいと思います。

noname#182748
質問者

お礼

回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

GCC なら C99 が使える. あとはコーディングの問題だけど, ・関数の最初の { はインデントせず行頭にある ・それ以外のブロックを始める { は行頭にないかインデントされている という条件を満たすなら $/ = undef; $program = <>; $program =~ s/\)\s*\n\{/$&printf("FileName: %s FunctionName: %s\\n, __FILE__, __func__);/g; print $program; でだいたいいけると思う. 上の条件を満たさないと突然面倒だが.

noname#182748
質問者

お礼

回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

一応確認だけど, 使っている C コンパイラはなんですか?

noname#182748
質問者

お礼

gccです。

すると、全ての回答が全文表示されます。

関連するQ&A