永远相信美好的事情终将发生

使用Eclipse调试Linux平台的C++程序

  最近的工作需要解析某个软件的代码及其运行过程,此软件运行在Linux系统,使用C++语言编写。在尝试Visual Studio失败之后利用Eclipse进行了初步探索,记录于此。
  此软件为开源程序,下载的源码中自带Makefile,只需通过运行make命令即可成功编译。经搜索,发现Visual Studio也支持Linux平台的C++开发,但是一番探索之后并未找到导入Makefile的选项,遂放弃。
注意事项:

  • Eclipse安装在WSL中,然后通过SSH连接到WSL进行操作。
  • 将项目导入到Eclipse中时,首先需要指定C/C++类型为Existing Code as Makefile Project,然后指定项目所在路径。
  • 首次运行之前,需要在Properties -> C/C++ Build -> Build directory中指定Makefile的路径,否则会报错,提示找不到Makefile
  • Debug之前,需要在Properties -> Run/Debug Settings选项卡中Main -> C/C++ Application指定上一步得到的可执行文件的路径,并在Arguments -> Program arguments中指定可执行文件的参数,及Arguments -> Working directory中指定执行命令的路径。当然,也可以通过Environment来设置环境变量。
  • 接下来便可通过窗口左上角的Run/Debug/Profile来指定运行的内容。

  其中运行Profile能够产生一个perf.data文件,在Project Explorer窗口中双击此文件,然后在Perf Profile View中可以查看程序运行过程中每个函数的时间消耗。这里Profile调用的是perf工具,此工具还能够分析函数调用情况,但貌似无法直接在Eclipse中查看结果。
  perf工具也可以在命令行中单独执行:

1
2
perf record --output=perf.data  ./command  #or -p pid 
perf report --input perf.data

  分析程序运行过程中的函数调用情况,还可以通过valgrind工具箱。valgrind包含了多种Profile工具,此处仅使用其callgrind功能来分析函数调用情况:
1
2
3
valgrind --tool=callgrind ./foo      # 会产生 callgrind.out.xxx 文件
callgrind_annotate callgrind.out.xxx # 打印结果
gprof2dot -f callgrind callgrind.out.xxx |dot -Tpng -o report.png # 图形化显示