首页 > 解决方案 > 获取调用函数调用的 C++ 程序中的所有行号

问题描述

例如,我有一个 C++ 程序:

#include <iostream>
#include<vector>

int main() {

    int a =0;
    //A vector of size 10 with all values as 1
    std::vector<std::size_t> v(10, 1);
    assert(v.size() == 10);
    return 0;
}

有没有办法找到调用函数调用的行号:

因此,我将在构造向量 v 以及调用向量的 size() 函数时的行号。

接受任何编程语言的实用程序,但优先考虑使用 gdb 解决方案来查找函数调用。

标签: c++gdb

解决方案


我会在构造向量 v 和调用向量的 size() 函数时的行号。

在 GDB 中没有简单的方法可以做到这一点,但您可以使用它objdump -d来获取CALL指令的地址。示例:使用您的程序,添加缺失#include <assert.h>并使用以下命令构建它:

$ gcc -g t.cc -fno-pie -no-pie

$ objdump -dC a.out | grep 'call.*>::vector'
  4011da:   e8 f9 00 00 00          callq  4012d8 <std::vector<unsigned long, std::allocator<unsigned long> >::vector(unsigned long, unsigned long const&, std::allocator<unsigned long> const&)>

$ objdump -dC a.out | grep 'call.*>::size'
  4011f2:   e8 8f 01 00 00          callq  401386 <std::vector<unsigned long, std::allocator<unsigned long> >::size() const>

现在您知道CALL指令的地址,您可以使用以下命令将它们转换为函数/文件/行addr2line

$ addr2line -fe a.out 4011da 4011f2
main
/tmp/t.cc:9
main
/tmp/t.cc:10 (discriminator 1)

推荐阅读