c++ - 获取调用函数调用的 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 解决方案来查找函数调用。
解决方案
我会在构造向量 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)
推荐阅读
- elasticsearch - 使用通配符的 ElasticSearch query_string 搜索与带连字符的搜索词不匹配
- python - 从 Marinetraffic 页面抓取数据
- node.js - 是否可以从 Cookie 中检索用户频道名称或在没有 API 作为依赖项的情况下对其进行身份验证?
- web-scraping - importxml 从破坏日志中收集价格
- visual-studio - 是否可以在我的应用程序模块名称中使用 /Machine 的值?
- python - 你可以在没有库的情况下在 python 中计算 t 统计量吗?如果可以,我可以举个例子吗?
- python - 如何比较同一熊猫数据框中的两个值
- python-3.x - 在 anaconda(HDF 文件)中设置导入时出错
- flutter - 使用 huawei_push 的 Flutter 应用被 Google Play 商店拒绝
- javascript - 如何通过按下按钮在同一网页上显示文本,按钮位于 Folium 地图上的弹出窗口中