使用 C++ 模板化代码库的慢速 GDB 响应

Slow GDB response with C++ templatized codebase

提问人:Aditya Garg 提问时间:11/9/2023 最后编辑:Aditya Garg 更新时间:11/10/2023 访问量:103

问:

我最近在调试时遇到了 GDB 的响应缓慢。

ptype <namespace::variable_name>对我来说花了一分钟多的时间。

我尝试运行 strace 来跟踪哪些调用使 GDB 卡住。在执行命令时,我看到大约有 5000 个 LSEEK 调用。每个调用都针对相同的偏移量。以下是相同的日志 -ptype <namespace::variable_name>

lseek(158, 4980736, SEEK_SET)           = 4980736
lseek(158, 4980736, SEEK_SET)           = 4980736
lseek(158, 4980736, SEEK_SET)           = 4980736
lseek(158, 4980736, SEEK_SET)           = 4980736
lseek(158, 4980736, SEEK_SET)           = 4980736
lseek(158, 4980736, SEEK_SET)           = 4980736
lseek(158, 4980736, SEEK_SET)           = 4980736
lseek(158, 4980736, SEEK_SET)           = 4980736
ptrace(PTRACE_PEEKTEXT, 865894, 0x7fffe0ccb260, [0x7fffe3a0c920]) = 0
rt_sigaction(SIGINT, {sa_handler=0x556e929a32e0, sa_mask=[INT], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0x7fb93304d090}, {sa_handler=0x556e929a32e0, sa_mask=[INT], sa_flags=SA_RESTORER|SA_RESTART, s>
brk(0x556ec2ea5000)                     = 0x556ec2ea5000
brk(0x556ec2ec6000)                     = 0x556ec2ec6000
brk(0x556ec2ee7000)                     = 0x556ec2ee7000
brk(0x556ec2f08000)                     = 0x556ec2f08000
brk(0x556ec2f29000)                     = 0x556ec2f29000
brk(0x556ec2f4a000)                     = 0x556ec2f4a000

似乎是 demangling 导致了这个问题。当我使用 将 demangle-style 设置为 none 时,相同的命令需要一秒钟才能响应。set demangle-style noneptype <mangled-name>

但是,使用损坏的名称进行调试非常不方便。所以我正在寻找解决 5k LSEEK 问题的解决方案。

有人可以帮忙调试这个吗?

预期应像往常一样在 < 5 秒内返回响应。ptype <namespace::variable_name>

环境详细信息:

  • GDB 版本: GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
  • 操作系统: Linux 5.4.0-135-generic #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
  • gcc 版本 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  • GDB:此 GDB 配置为“x86_64-linux-gnu”
  • 所有链接的 .so 文件的总大小:350 MB

更新:我BOOST_FORCEINLINE了大约 90% 的函数,这些函数都是某个模板类的成员函数。一旦我删除了BOOST_FORCEINLINE关键字,gdb ptype/print 问题就解决了。so 文件的大小仍与以前相同。我不明白为什么强制内联会导致 gdb 变慢。有什么想法吗?

C++ GCC GDB

评论

3赞 Alan Birtles 11/9/2023
哪个版本的 gdb?哪个站台?您的可执行文件有多大?
0赞 Aditya Garg 11/9/2023
GDB 9.2.也尝试过 GDB 版本 13.2,但遇到了同样的问题。使用 Ubuntu-20 机器 (Linux x86)。我有多个 .so 文件链接在一起。所有 .so 文件的总大小为 350 MB
1赞 Alan Birtles 11/9/2023
这些详细信息应编辑到您的问题中
1赞 HolyBlackCat 11/9/2023
我会将其报告为 GDB 错误。
0赞 Aditya Garg 11/9/2023
sourceware.org/bugzilla/show_bug.cgi?id=31048 也做过同样的事。只是想在这里发帖,以防有人已经遇到过类似的事情,他们可以帮助我。

答: 暂无答案