Debugging 如何在GDB中加快Firefox的启动速度

Debugging 如何在GDB中加快Firefox的启动速度,debugging,testing,firefox,automated-tests,gdb,Debugging,Testing,Firefox,Automated Tests,Gdb,我有大量的HTML文件要调试。我编写了一个pythongdb脚本,调用GDB./path/to/firefox,打开firefox中的每个HTML文件,然后运行脚本来做我想做的事情。问题是这个过程非常慢。我想知道有没有更快的方法来做到这一点 我注意到,除了gdb输出以下内容后的点之外,其他一切都相当快: $ gdb ../firefox-63.0.3/objdir-ff-dbg/dist/bin/firefox GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.2018

我有大量的HTML文件要调试。我编写了一个pythongdb脚本,调用
GDB./path/to/firefox
,打开firefox中的每个HTML文件,然后运行脚本来做我想做的事情。问题是这个过程非常慢。我想知道有没有更快的方法来做到这一点

我注意到,除了gdb输出以下内容后的点之外,其他一切都相当快:

$ gdb ../firefox-63.0.3/objdir-ff-dbg/dist/bin/firefox
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ../firefox-63.0.3/objdir-ff-dbg/dist/bin/firefox...done.
(gdb) set args file:///home/ug16zy2/test.html 
(gdb) r
Starting program: /home/ug16zy2/firefox-63.0.3/objdir-ff-dbg/dist/bin/firefox file:///home/ug16zy2/test.html 
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
GDB在做什么?我如何避免花费如此长的时间

PS:我需要使用GDB,因为我想在执行JS代码中的特定行时停止进程。不幸的是,该行位于使用事件侦听器注册的回调中。问题归结为当事件监听器被触发并且其回调函数完成执行时停止Firefox。(如果有其他方法可以达到同样的效果,请告诉我:)非常感谢!)

GDB在做什么?我如何避免花费如此长的时间

这里发生了一些事情:

  • GDB读取firefox二进制文件本身的调试信息,然后运行它
  • firefox
    加载共享库时,动态加载程序通知GDB它们,GDB读取它们的调试信息
  • 加载
    libpthread
    时,GDB加载
    libthread_db
    并将其设置为通知GDB线程创建和销毁事件(此时打印
    使用主机libthread_db
    消息)
  • firefox
    自动初始化
  • firefox
    开始实际运行(做有用的工作)
  • 通过
    启用
    设置verbose,您可以看到GDB的更多操作

    我猜想,
    firefox
    binary只与少数共享库直接链接,并且
    dlopen
    s在它开始运行后(即在上面的步骤4期间)将与大多数必需的库直接链接

    我进一步猜测,有些库很大,为它们加载调试信息需要一段时间

    如果在
    设置verbose on
    后,您发现上述猜测是正确的,则可以使用
    设置auto solib add off
    禁用共享库的符号自动加载。然后,您可以使用
    sharedlibrary libfoo
    命令仅添加需要符号的库(如果有)

    更新:

    它实际上占用了从libxul.so加载符号的大部分时间。但是我想我需要它来调试Firefox。是否有办法预加载这些符号或避免每次加载此库

    我认为将脚本“由内而外”会有帮助——启动一个GDB会话,并在该会话中使用不同的参数重复执行
    run
    命令

    但我不确定这是否真的有帮助:上次我在GDB上工作时,它放弃并重新读取了低级(正在调试)程序重启时的所有DSO

    如果GDB仍然这样做,我能想到的唯一解决方案是:

  • 尝试改用LLDB。它可能更快,也可能与“由内而外”的脚本一起工作
  • 使用较少的调试信息构建
    libxul.so
    (即,仅为调试所需的文件添加
    -g
    ,并使用
    -g0
    构建其余文件)

  • 正如另一个答案所指出的,问题在于gdb对debuginfo缓存还很幼稚。而且,因为libxul太大了,它需要相当长的时间

    如果您有GDB8.3或更高版本,您可以通过使用新的
    索引缓存
    功能在一定程度上解决这个问题。要使用它,只需键入:

    (gdb) set index-cache on
    
    。。。或者把它放在你的
    ~/.gdbinit
    中以获得最佳效果

    索引缓存会将debuginfo的索引写入缓存目录中的文件(键入
    show index cache directory
    查看位置)。这将加快重新阅读的速度


    请注意,现在没有任何东西可以修剪索引缓存——这是主要的缺点。因此,您可能希望偶尔在此处删除旧文件。缺少修剪是默认情况下未启用缓存的一个原因。

    您的
    ~/.gdbinit
    文件中是否有任何内容会导致运行的进程反复停止和启动,例如断点、观察点、捕捉点、跟踪、收集、句柄、记录等?@MarkPlotnick,我在
    ~/.gdbinit
    中添加了
    自动加载安全路径/home/ug16zy2/firefox-63.0.3/.gdbinit
    设置自动加载安全路径/
    。在
    /home/ug16zy2/firefox-63.0.3/.gdbinit
    中,只有更多自定义命令的定义。注释第一行并没有加快速度。我检查过了。它实际上占用了从
    libxul.so
    加载符号的大部分时间。但是我想我需要它来调试Firefox。有没有办法预加载这些符号或避免每次加载此库?谢谢!是gdb在程序重新启动时重新读取所有DSO:(
    (gdb) set index-cache on