C++ GDB和随机暂停分析方法
我正在尝试用配置文件分析我的代码。我基本上是在GDB会话下运行代码,并使用Ctrl+c和C++ GDB和随机暂停分析方法,c++,shell,gdb,profiling,C++,Shell,Gdb,Profiling,我正在尝试用配置文件分析我的代码。我基本上是在GDB会话下运行代码,并使用Ctrl+c和backtrace命令在随机时间查看调用堆栈。这似乎有效:代码最慢的部分(循环)几乎在所有暂停时都在堆栈中,我可以找到堆栈中的模式 问题就在这里。我正在尝试使用以下shell脚本自动化分析过程: while true do if [ -n "$(pidof MyCode)" ]; then gdb -ex "set pagination 0" -ex "thread apply al
backtrace
命令在随机时间查看调用堆栈。这似乎有效:代码最慢的部分(循环)几乎在所有暂停时都在堆栈中,我可以找到堆栈中的模式
问题就在这里。我正在尝试使用以下shell脚本自动化分析过程:
while true
do
if [ -n "$(pidof MyCode)" ]; then
gdb -ex "set pagination 0" -ex "thread apply all bt" -batch -p $(pidof MyCode) >> Log.txt
sleep 1
else
break
fi
done;
当我检查输出文件Log.txt
时,我意外地从未在堆栈中看到代码的缓慢部分
Q:在GDB会话中评测和从脚本调用GDB评测如何产生不同的结果
一些注意事项:
- 我使用不同数量的样本(从5到50)多次尝试了这两种方法
- 慢函数是一个与OpenMP并行的循环
- 我不能在这里显示代码。我试图用较小的代码重现这种行为,但没有成功
在上面的脚本中,如果我将
gdb
命令放在kill-SIGSTOP$pid
和kill-SIGCONT$pid
之间,并设置变量GOMP\u CPU\u AFFINITY
,我会得到使用gdb会话的类似结果。我的猜测是,当代码处于并行循环中时,脚本无法执行gdb
命令,因为所有内核都很忙。为什么不使用适当的采样探查器,比如linux'perf
?@Ilyapov简短回答:我想看看堆栈中有什么。详细回答:请查看我问题的链接和其中的参考资料。也许总是睡一秒钟还不够随机。如果你将睡眠1
替换为睡眠0.$RANDOM
,你会看到什么不同吗?@Ilyapov:当速度是你的目标时,随机暂停,虽然粗糙,但效果更好,因为它能找到适当的分析器所能找到的加速超集。原因:a)他们倾向于在cpu上或非cpu上采样,但不是在墙上采样。b) 在样本分析中,他们用数量代替质量(因为他们更关心测量而不是寻找加速)。显示了在探查器中隐藏加速是多么容易。这说明了为什么这是一个杀手。我一直不明白为什么有人想让它自动化,因为它的价值在于你对每个样本的关注。您可以看到样本摘要器无法看到的东西。我相信你知道它背后的原理:如果某样东西可以节省部分时间,那么你需要看两次的样本数平均是2/F。如果F是0.5:4个样本。如果F为0.2:10个样本。如果F为0.8:2.5个样本。无限循环:2个样本。潜在的加速比越大,样本就越少。为什么不使用合适的采样分析器,比如linux“perf
?@Ilyapov简短回答:我想看看堆栈中有什么。详细回答:请查看我问题的链接和其中的参考资料。也许总是睡一秒钟还不够随机。如果你将睡眠1
替换为睡眠0.$RANDOM
,你会看到什么不同吗?@Ilyapov:当速度是你的目标时,随机暂停,虽然粗糙,但效果更好,因为它能找到适当的分析器所能找到的加速超集。原因:a)他们倾向于在cpu上或非cpu上采样,但不是在墙上采样。b) 在样本分析中,他们用数量代替质量(因为他们更关心测量而不是寻找加速)。显示了在探查器中隐藏加速是多么容易。这说明了为什么这是一个杀手。我一直不明白为什么有人想让它自动化,因为它的价值在于你对每个样本的关注。您可以看到样本摘要器无法看到的东西。我相信你知道它背后的原理:如果某样东西可以节省部分时间,那么你需要看两次的样本数平均是2/F。如果F是0.5:4个样本。如果F为0.2:10个样本。如果F为0.8:2.5个样本。无限循环:2个样本。潜在加速比越大,样本越少。