对用于跟踪或分析 C++ 控制台应用程序执行和差异跟踪的工具的建议

Posted

技术标签:

【中文标题】对用于跟踪或分析 C++ 控制台应用程序执行和差异跟踪的工具的建议【英文标题】:Suggestions for tools for tracing or profiling C++ console app execution and diffing traces 【发布时间】:2011-10-09 13:38:59 【问题描述】:

我想使用两组不同的命令参数来跟踪 Nmap 的执行情况,并对结果进行比较,以便我可以了解为什么在代码中采用不同的路径。

在我的 Win32 XP SP3 机器上,nmap -F -v -d -n <target_host>nmap -F -v -v -d -n <target_host> 两个命令在代码中应该采用几乎相同的路径(除了处理额外的 -v arg 之外),但它们没有。我发现调用getAdapterAddresses 返回ERROR_INVALID_PARAMETER 存在一些问题,这导致nmap 退出并显示一条错误消息,该错误消息与参数略有不同。我已经提交了一个似乎可以解决 getAdapterAddresses 问题的补丁,但现在我想找出应用程序在不同位置退出的原因(请参阅此nmap-dev mailing-list post 及其后续跟进以了解更多背景信息)。

该项目是为 Visual Studio Express 2010 VC++ 设置的,我正在寻找一种方法来跟踪上述 Windows 框上的执行情况,然后对结果进行比较。

我应该寻找哪些工具?

【问题讨论】:

对于系统调用,你可以试试STraceNT。对于库调用,请查看 Sysinterals 的Process Monitor。 感谢@KerrekSB,我确实需要跟踪 nmap 函数,但我会尝试您的建议,看看它们是否有什么好处。 STraceNT 产生了两个输出 ca。 1GB 几乎没有共同点,所以不是很有用。 有趣。好吧,如果系统调用都不同,那么我假设程序在两种情况下确实采用了非常不同的代码路径。 在进行参数解析之前,路径至少应该相同。我想我只需要跟踪 nmap 函数调用 - processmon 还给了我输出,这些输出非常不同且难以匹配 【参考方案1】:

如果没有人想出更好的方法,您可以使用 LukeStackwalker 来执行此操作,它会根据其分析的代码生成可视化调用图,因此您可以轻松地在视觉上比较这些图(以及调用次数和函数花费的时间)超过它所需要的样本数量)。

【讨论】:

感谢您的建议。我发现 LukeStackwalker 对于比较两条轨迹不是很有用。我开始多次运行相同的命令并比较生成的 .lsd 文件 - 我发现每种情况下的采样都完全不同,我想这是堆栈采样方法的问题的症结所在。我发现调用图对于比较也毫无用处。我还必须让 nmap.main 休眠 5 秒,否则它会在 LS 甚至准备开始采样之前完成。【参考方案2】:

Visual Studio 2010 Premium 和 Ultimate 版本有一个很好的分析工具,可以从中导出生成报告的各种元素(csv 或 xml)。

我将调用树导出到 csv 并使用 Beyond Compare 区分它们,这对我有很大帮助。

【讨论】:

以上是关于对用于跟踪或分析 C++ 控制台应用程序执行和差异跟踪的工具的建议的主要内容,如果未能解决你的问题,请参考以下文章

C语言dev c++,选项release,debug,profiling啥意思?

C++ 中的运行时内存分析

k3中,预收单为啥不能和销售发票、其他应收单进行关联啊?

用于分析结果的基于文本的查看器

LinuxBPF学习笔记 - 堆栈跟踪[3]

LinuxBPF学习笔记 - 堆栈跟踪[3]