【问题标题】:Program takes 5 seconds to terminate. Tool for debugging?程序需要 5 秒才能终止。调试工具?
【发布时间】:2021-08-30 16:23:07
【问题描述】:

我使用 Opensplice DDS 6.7 创建了一个工具来创建读取器,等待回调对读取的消息执行,并打印消息的值。我们将 Google Protobuf 用于我们的消息结构。打印出消息的值并执行return 0;后,程序需要将近5秒才能真正终止。

单步执行 GDB 显示了对 Protobuf 中的析构函数的许多调用以及来自 opensplice 的线程连接。是否有 unix 工具或 GDB 工具来分析线程/函数的挂钟执行时间或函数被调用的次数,以帮助缩小导致破坏挂起的库或包装器的范围?

【问题讨论】:

  • 你开启优化了吗?
  • 使用 -O3 编译对这种行为没有明显的影响。我在没有优化的情况下进行调试,所以我可以看到这些符号,但是在优化程序时也会发生同样的事情。
  • 在strace下运行,看看程序挂起的地方是否有系统调用。
  • 谢谢!这正是我一直在寻找的,请随时回答,我会接受。很长一段时间都在调用睡眠并使用 GDB 我缩小了哪些线程是最后加入的。

标签: c++ protocol-buffers opensplice


【解决方案1】:

Strace 是我一直在寻找的工具。帮助确定销毁期间发生的情况,以揭示 opensplice 的线程之一在终止前休眠了约 5 秒。最终发现问题出在使用系统 opensplice 配置而不是应用程序的一个设置。切换使用哪个 opensplice 配置后,程序快速而优雅地终止。

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    相关资源
    最近更新 更多