繁体   English   中英

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

[英]Distributed software debug with gdb

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

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

谢谢

您可以尝试这样做:

首先在远程主机上使用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教程: 服务器下级

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM