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

6

我目前正在使用Linux和C++开发分布式软件,该软件在20多个节点上同时运行。因此,我发现最具挑战性的问题之一是如何进行调试。

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

谢谢


1
有趣的问题。我会先对2或3个节点进行调试(例如使用2或3个终端)。注意Heisenbug - Basile Starynkevitch
这是我迄今为止使用的方法。但我仍然想知道如何将每个gdbserver附加到主gdb会话中。 - Vicente Bolea
2个回答

6
你可以尝试这样做:
首先,在远程主机上使用gdbserver启动节点。如果您使用--multi标志启动它,甚至可以在没有要调试的程序的情况下启动它。当服务器处于多模式时,您可以从本地会话控制它,也就是说,您可以让它启动您想要调试的程序。 然后,在您的gdb会话中启动多个inferior(次要进程)。
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 会话中。问题是,据我所知,这并没有比从不同的控制台选项卡启动多个 gdb 更好。另一方面,你可以通过这种方式编写一些脚本或自动测试。请参阅 gdb 教程: serverinferiors

1
这正是我一直在寻找的。感谢您的答案!:D - Vicente Bolea

1
我不相信有一个简单的答案来调试“许多远程应用程序”。是的,您可以附加到另一台机器上的进程,并在GDB中逐步执行它。但是在调试大量相互依赖的进程时,尤其是当问题很复杂时,这会非常棘手。
我认为,在代码中使用良好的日志记录功能,并根据需要补充特定调试的其他日志,更有可能为您提供良好/快速的结果。
另一个选择可能是在一台机器上运行进程,而不是在多台机器上运行。甚至可以在一个进程内使用线程,以模拟多个机器的行为,简化调试过程。当然,这并不能防止仅在您在20个不同的机器上运行时才出现的错误。但基本思想是将这些错误的数量减少到最小,并在“更简单的环境”中调试大多数问题。
积极使用防御性编程范例,例如广泛使用assert,显然是一个好主意(也许还要使用一个宏来关闭生产运行,但确保您不要完全忽略错误路径——检测某些东西崩溃的原因是内存分配失败要比跟踪NULL指针来自某个失败的分配的20个函数调用更难)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接