要搜索具有特定签名调用的功能吗?

时间:2019-04-09 16:35:06

标签: c++ function debugging signature tracing

假设我有一些C ++函数:

void A(int i) {
/* some code */
}

void A(string s) {
/* some code */
}

void A(string s, int i) {
/* some code */
}

假设第一个调用占A()调用的80%,第二个调用占15%,最后一个调用占5%。

我想静态跟踪呼叫。如果我对第一种调用感兴趣,没问题,大多数“ A(”)的字符串搜索结果都将是类型1,但是如果我只想要类型2或类型3,那么我将不需要很多类型1发出的噪音。

对于类型3,正则表达式可以帮助我寻找以下括号内A(*,*,*)之间恰好有2个逗号的字符串(我实际上不知道RE的编程语法)

但是对于类型2,这是行不通的。

我可以使用任何技术来通过其签名找到函数调用吗?

编辑:“跟踪”的意思是通过查找所需函数的所有调用点来理解当前代码库。

1 个答案:

答案 0 :(得分:2)

  

对于类型3,正则表达式可以帮助我查找以下括号内的括号A(,*)之间恰好有2个逗号的字符串(我实际上不知道RE的编程语法)

     

但是对于类型2,这是行不通的。

     

我可以使用任何技术来通过其签名找到函数调用吗?

除了使用一些正则表达式搜索文件(例如,使用Notepad ++文件搜索,egrep或类似工具),并假设您能够更改声明/定义这些函数的源代码之外,还可以使用一些编译器标准[[deprecated]]属性之类的功能:

   void A(int i) {
   /* some code */
   }

   [[deprecated]] void A(string s) {
// ^^^^^^^^^^^^^^
   /* some code */
   }

   [[deprecated]] void A(string s, int i) {
// ^^^^^^^^^^^^^^
   /* some code */
   }

使用这些功能时,将向您显示警告:

int main() {
    A(5);
    A("Hello");
    A("Hello",42);
}
main.cpp:9:25: note: declared here
     [[deprecated]] void A(string s) {
                         ^
main.cpp:20:18: warning: 'void A(std::__cxx11::string)' is deprecated [-Wdeprecated-declarations]
         A("Hello");
                  ^
main.cpp:9:25: note: declared here
     [[deprecated]] void A(string s) {
                         ^
main.cpp:21:21: warning: 'void A(std::__cxx11::string, int)' is deprecated [-Wdeprecated-declarations]
         A("Hello",42);
                     ^
main.cpp:13:25: note: declared here
     [[deprecated]] void A(string s, int i) {
                         ^
main.cpp:21:21: warning: 'void A(std::__cxx11::string, int)' is deprecated [-Wdeprecated-declarations]
         A("Hello",42);
                     ^
main.cpp:13:25: note: declared here
     [[deprecated]] void A(string s, int i) {
                         ^

请参阅使用g ++编译的online example

您甚至可以用一条消息修饰您的同事,以维护代码库:

   [[deprecated("Get rid of these performance killing calls."
                " Use A(A::getPrecomputedHash(s)) instead.")]] 
      void A(string s) {
      }