【问题标题】:gdb: How do I pause during loop execution?gdb:如何在循环执行期间暂停?
【发布时间】:2012-01-31 22:12:44
【问题描述】:

我正在使用 NetBeans 7 作为我的 IDE,在 Windows 7 的 mingw32 下用 g++ 编写软件渲染器。

我最近一直需要对其进行剖析,而现在我已经完成了对结构的铺设,这种需求已经达到了临界点。我环顾四周,在我看来,this answer 显示出最大的希望是同时跨平台并保持简单。

这种方法的要点是,可能最基本(在许多方面,最准确)的分析/优化方法是不时地直接对堆栈进行采样,然后停止执行......不幸的是,NetBeans 不会暂停。所以我正在尝试找出如何直接使用 gdb 进行采样。

我对 gdb 了解不多。不过,我可以从手册页中看出,您在运行可执行文件之前设置了断点。这对我没有帮助。

有谁知道将 gdb(或其他 gnu 工具)用于以下任一的简单方法:

  1. 当我这么说时对堆栈进行采样(最好)
  2. 在给定时间段内以随机间隔抽取一大堆样本

...给出我所说的配置?

【问题讨论】:

  • 在某个文件和某行或某个类的某个方法处设置断点对您没有帮助吗? unknownroad.com/rtfm/gdbtut/gdbbreak.html
  • @Yaniro,遗憾的是没有。正如我链接到的那个答案中所述,它需要进行时间间隔采样,才能达到预期的效果。如果我只在代码中的特定位置执行此操作,我将看不到大部分时间都花在了哪里,我只会看到断点所在的那些位置。

标签: c++ debugging netbeans gdb gnu


【解决方案1】:

您是否尝试过在 gdb 中简单地运行您的可执行文件,然后在您想要中断它时直接按 ^C (Ctrl+C)?这应该会让你进入 gdb 的提示符,在那里你可以简单地运行 where 命令来查看你的位置,然后使用 continue 继续执行。

如果您发现自己处于不相关的线程中(例如循环 UI 线程),请使用 threadinfo threadsthread n 转到正确的线程,然后执行 where

【讨论】:

  • 好的,它现在正在接收 SIGINT,这很好。谢谢你。唯一的问题是,每次我停止它时,我都会发现自己处于 NlsUpdateSystemLocale() (在 kernel32.dll 中)——我认为它正在查看错误的线程。如果您有任何提示,他们将受到欢迎。标记为已接受。
  • 想通了,gdb 显然不(总是?)知道正确的线程是什么,它只是选择线程列表顶部的一个,至少在我的 mingw 安装中。我只需要执行 gdb 命令threadinfo threadsthread n,其中 n 是我正在运行的程序的线程数。再次感谢。
  • Ctrl + C 对某些人不起作用:stackoverflow.com/questions/5857300/…
  • 不按Ctrl+C怎么打断?我正在调试一个程序锁定整个桌面环境的问题,因此我无法再访问运行 GDB 的终端。我可以在指定时间后中断吗,比如程序启动后 10 秒?
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2012-02-06
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多