c++ - 在调试中,如何知道函数重复调用中参数的统计信息(最大-最小值、平均值、分布...)?

标签 c++ visual-studio debugging

假设我有一个函数 void Myclass::func(x),而其他各种代码对它进行了数千次调用。现在我想知道参数 x 的一些统计数据,例如平均值、最大值、最小值,甚至分布图。

void Myclass::func(int x) {
    while(foo.doFancyStuff(x)) {
        // ...
    }
}

这是我想到的一些临时方法:

  1. 打印x 的每个值以记录。然后使用外部工具/脚本来分析它们。
    • 注意事项:与日志中的其他信息混合。将 x 的每个值写入外部日志或文件系统上的文件很慢。
  2. 定义全局变量来存储它们并在感兴趣的执行结束时进行分析。
    • 警告:全局变量不好。他们将来会变得困惑。
  3. 将它们存储在 Myclass 类中。
    • 警告:不可重复使用的代码。下次我想分析 Otherclass::doOtherStuff(y) 怎么办?并且集成不好,因为统计代码不应该与 Myclass 本身耦合。

是否有任何工具/库可以执行此操作?我在 Windows 上使用 Visual Studio,所以想要一个可用于该平台的答案。也欢迎使用跨平台工具。

最佳答案

这是一个使用 lldb 脚本 API 的示例(也适用于 Windows)。以这个简单的程序为例,

void func(int x) {}

int main(int, char **)
{
    for (int i = 0; i < 1000; ++i)
        func(i);
}

你可以用这样的脚本来分析

import lldb
import os

fArgs = []

def analyzeFrame(frame, bpLocation, dict):
    variables = frame.GetVariables(True, False, False, False)
    x = variables.GetValueAtIndex(0).GetValueAsSigned()
    fArgs.append(x)
    return False

debugger = lldb.SBDebugger.Create()
debugger.SetAsync(False)
target = debugger.CreateTargetWithFileAndArch("pathToYourExecutable", "")

bp = target.BreakpointCreateByName("func", 4, lldb.SBFileSpecList(), lldb.SBFileSpecList())

bp.SetScriptCallbackFunction("analyzeFrame")

process = target.Launch(target.GetDebugger().GetListener(), [], [],
    None, None, None, os.getcwd(), 0, False, lldb.SBError())

print("max: {}".format(max(fArgs)))
print("min: {}".format(min(fArgs)))

您需要确保 python 解释器找到 lldb 模块。在命令行执行lldb -P可以看到路径。

关于c++ - 在调试中,如何知道函数重复调用中参数的统计信息(最大-最小值、平均值、分布...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54399218/

相关文章:

c++ - SDL_TTF 系统字体

c# - 为什么不能在 Visual Studio 2013 的条件断点中使用 lambda?

python - 如何为引发异常的 Python 控制台应用程序运行 Python 调试器

c - 使用 winapi 启用 ClearType 字体

linux - 从伪 tty 中分离一个 linux 进程,但保持 tty 运行?

android - 如何调试从 Play 商店安装的 APK(不删除保存的用户数据)

c++ - 在 Harmattan 上制作 QWidget 应用程序肖像的明确指南

c++ - 恢复线程上下文并继续执行?

C++ 在 PATH 的所有文件中搜索

c# - 对锁使用 protected 字段是否可以(或者我可以避免 protected 锁而不添加辅助方法,如获取锁等。在基础中)?