我目前正在编写一个多线程、高效且可扩展的算法。因为我必须猜测代码的参数并且我不确定计算在特定数据集上的执行情况,所以我想观察一个变量。该测试仅适用于真实世界的庞大数据集。可以在分析后分析收集的数据。想象一下下面的简单代码示例(实际代码可以包含多个观察点:
// function get's called by loops of multiple threads
void payload(data_t* data, double threshold) {
double value = calc(data);
// here I want to watch the value
if (value < threshold) {
doSomething(data);
} else {
doSomethingElse(data);
}
}
我考虑了以下方法:
- 使用
cout
或其他系统输出 - 使用二进制输出(文件、网络)
- 通过 gdb/lldb 设置断点
- 通过 gdb/lldb 使用变量监视 + 日志记录
我对结果不满意,因为:要使用 1. 和 2. 我必须更改代码,但这是一个调试/评估任务。此外 1. 需要锁定和 1.+2。需要 I/O 操作,这会大大降低整个代码的速度,并且几乎不可能使用真实数据进行测试。3.也太慢了。要使用 4.,我必须知道变量地址,因为它不是全局变量,但是因为线程是由动态调度程序创建的,所以这需要对每个线程进行中断 + 步进。
所以我的结论是,我需要一个在机器代码级别工作的分析器/调试器,并且可以在没有双->字符串转换的情况下转储/记录/监视变量,并且效率很高,或者总结一下:我想分析我的算法的内部状态没有严重减速并且没有进行深度修改。有人知道能够做到这一点的工具吗?