提问人:Aditya Garg 提问时间:11/9/2023 最后编辑:Aditya Garg 更新时间:11/10/2023 访问量:103
使用 C++ 模板化代码库的慢速 GDB 响应
Slow GDB response with C++ templatized codebase
问:
我最近在调试时遇到了 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 none
ptype <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 变慢。有什么想法吗?
答: 暂无答案
评论