gdb:如何在循环执行期间暂停?

51

我正在使用NetBeans 7作为我的IDE,在Windows 7的mingw32下使用g ++编写软件渲染器。我最近一直需要对其进行分析,现在这种需求已经达到了临界点,因为我已经完成了结构的布局。

我查看了一些信息,我认为这个答案似乎是同时跨平台并保持简单的最有前途的方法。

这种方法的要点是,可能最基本的(在许多方面上最准确的)方法是通过暂停执行时直接抽样堆栈来进行分析/优化...不幸的是,NetBeans不会暂停。因此,我试图找出如何直接使用gdb进行此抽样。

我对gdb不是太熟悉。从手册中可以得知的是,在运行可执行文件之前设置断点。 这对我没有用。

有人知道一个简单的方法来使gdb(或其他GNU工具):

  1. 在我说时抽样堆栈(首选)
  2. 在给定时间段内随机间隔取一堆样本

......请给出我的配置?


1
在某个文件和某一行或者某个类中的某个方法处设置断点对您没有帮助吗?http://www.unknownroad.com/rtfm/gdbtut/gdbbreak.html - Yaniro
1
@Yaniro,很遗憾不行。正如我在链接中提到的那个答案所述,它需要进行时间间隔采样,以发挥所需的效果。如果我只在代码的特定位置进行采样,我将看不到大部分时间都被花费在哪里,我只会看到断点所在的那些位置。 - Engineer
可能是在没有断点的情况下暂停gdb的重复问题。 - Ciro Santilli OurBigBook.com
1个回答

87
你是否尝试在gdb中运行可执行文件,然后在需要中断时,只需按下^C (Ctrl+C)即可?这将使你进入gdb的提示符,然后可以简单地运行where命令查看当前位置,并且用continue继续执行。
如果你发现自己在一个无关的线程中(例如循环的UI线程),请使用threadinfo threadsthread n去正确的线程,然后执行where

好的,现在它正在接收SIGINT,这很棒。谢谢。唯一的问题是每次我停止它时,我会发现自己在NlsUpdateSystemLocale()中(在kernel32.dll中)-- 我想它正在查看错误的线程。如果您有任何提示,欢迎分享。标记为已接受。 - Engineer
4
搞清楚了, gdb 显然不总是知道正确的线程是哪一个,它只是选择线程列表顶部的线程,至少在我的 mingw 安装中是这样。我只需要执行 gdb 命令 thread, info threadsthread n,其中 n 是我正在运行程序的线程编号。再次感谢。 - Engineer
5
有些人发现按下“Ctrl + C”无法中断进程,这个问题在StackOverflow上有讨论:https://dev59.com/x2025IYBdhLWcg3wsIEU - Ciro Santilli OurBigBook.com
1
我如何在没有使用Ctrl+C的情况下中断程序?我正在调试一个问题,其中一个程序锁定了整个桌面环境,因此我无法再访问运行GDB的终端。我能否在程序启动后指定时间(例如10秒)后中断程序? - Aaron Franke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接