我们目前正在开发C中的集群管理器软件.如果有几个节点连接到管理器,它可以很好地工作,但是如果我们使用一些工具模拟1000个节点来连接管理器,它有时会以意想不到的方式工作.
如何调试这种bug?它仅在负载(连接/节点)很大时出现?
如果我gdb一步一步地调试,应用程序永远不会出现故障.
如何调试这种错误?
通常,您至少要使用以下技术:
-Wall是一个好的开始,但-Wextra更好。valgrind检查中也没有警告。
尚不清楚您是否只是在Valgrind下运行目标应用程序,还是还具有单元测试,并且测试是否为Valgrind-clean。还不清楚您是否在Valgrind下观察到应用程序的不良行为。
Valgrind曾经是解决堆和非初始化内存问题的最佳工具,但是在2017年,情况不再如此。
基于编译器的Address,Thread和Memory清理程序捕获的错误类别大得多(例如,全局和堆栈溢出以及数据争用),因此您应该在所有错误下运行单元测试。
当上述所有方法仍然找不到问题时,您可以运行带有消毒剂的实际应用程序。
最后,还有诸如GDB跟踪和systemtap之类的工具-较难学习,但具有强大的功能。这里概述。