Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GDB和随机暂停分析方法_C++_Shell_Gdb_Profiling - Fatal编程技术网

C++ GDB和随机暂停分析方法

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

我正在尝试用配置文件分析我的代码。我基本上是在GDB会话下运行代码,并使用Ctrl+c和
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)多次尝试了这两种方法
  • 是C++代码
  • 慢函数是一个与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个样本。潜在加速比越大,样本越少。