如何调试仅在负载巨大时出现的错误?

Sat*_*ato 14 c debugging gdb

我们目前正在开发C中的集群管理器软件.如果有几个节点连接到管理器,它可以很好地工作,但是如果我们使用一些工具模拟1000个节点来连接管理器,它有时会以意想不到的方式工作.

如何调试这种bug?它仅在负载(连接/节点)很大时出现?

如果我gdb一步一步地调试,应用程序永远不会出现故障.

Emp*_*ian 5

如何调试这种错误?

通常,您至少要使用以下技术:

  1. 确保代码编译和链接时没有警告。这-Wall是一个好的开始,但-Wextra更好。
  2. 确保该应用程序具有内置的日志记录和跟踪功能,可以打开或关闭它们,并且具有调试此类问题的足够详细信息,并且开销较低。
  3. 确保代码具有良好的单元测试覆盖率。
  4. 确保测试是清洁的。

valgrind检查中也没有警告。

尚不清楚您是否只是在Valgrind下运行目标应用程序,还是还具有单元测试,并且测试是否为Valgrind-clean。还不清楚您是否在Valgrind下观察到应用程序的不良行为。

Valgrind曾经是解决堆和非初始化内存问题的最佳工具,但是在2017年,情况不再如此。

基于编译器的AddressThreadMemory清理程序捕获的错误类别大得多(例如,全局和堆栈溢出以及数据争用),因此您应该在所有错误下运行单元测试。

当上述所有方法仍然找不到问题时,您可以运行带有消毒剂的实际应用程序。

最后,还有诸如GDB跟踪systemtap之类的工具-较难学习,但具有强大的功能。这里概述。