使用gdb进行分布式软件调试

时间:2014-02-09 07:22:22

标签: c++ linux parallel-processing gdb distributed-computing

我目前正在使用linux在C ++中开发一个分布式软件,它同时在20多个节点中执行。所以我找到的最具挑战性的问题之一是如何调试它。

我听说可以在单个gdb会话中管理多个远程会话(例如,在我创建gdb会话的主节点中以及在使用gdbserver启动程序的每个其他节点中),是否可能?如果是这样,你能举个例子吗?你知道其他任何办法吗?

由于

2 个答案:

答案 0 :(得分:6)

您可以尝试这样做:

首先在远程主机上使用gdbserver启动节点。如果用--multi标志启动它,甚至可以在没有调试程序的情况下启动它。当服务器处于多模式时,您可以从本地会话控制它,我的意思是您可以启动它想要调试的程序。 然后,在gdb会话中启动多个下级

gdb> add-inferior -copies <number of servers>

将它们切换到远程目标并将它们连接到远程服务器

gdb> inferior 1
gdb> target extended-remote host:port // use extended to switch gdbserver to multi mode
// start a program if gdbserver was started in multi mode
gdb> inferior 2
...

现在,您将它们全部附加到一个gdb会话。问题是,AFAIK,它不比从不同的控制台选项卡启动多个gdb好多少。另一方面,您可以通过这种方式编写一些脚本或自动测试。请参阅gdb教程:serverinferiors

答案 1 :(得分:1)

我不相信调试“许多远程应用程序”有一个简单的答案。是的,您可以附加到另一台机器上的进程,并在GDB中逐步执行。但调试大量相互依赖的进程非常尴尬,特别是在问题复杂时。

我相信代码中的一组良好的日志记录功能,根据需要补充了用于特定调试的附加日志,更有可能为您提供良好/快速的结果。

另一种选择可能是在一台机器上运行进程,而不是在多台机器上运行。甚至可以在一个进程中使用线程来模拟多个机器的行为,从而简化调试过程。当然,这并不能防止在20台不同的计算机上运行20个进程时出现的错误。但基本思想是将这些错误的数量减少到最少,并在“更简单的环境”中调试大多数事情。

积极使用防御性编程范例,例如自由使用assert显然是一个好主意(也许有一个宏可以为生产运行关闭它,但要确保你不要只留下错误路径完全未经检查 - 很难发现崩溃的原因是内存分配失败,而不是追踪那些空指针来自失败分配的20个函数调用的位置。