GDB 如何实现将自身附加到正在运行的进程的壮举?
我需要类似的功能,我可以向正在运行的进程发出 CLI 命令。例如,我可以查询进程内部状态,例如 show total_messages_processed? 我如何构建对在 linux 下向正在运行的进程发出命令的支持?
是否有一个库可以为正在运行的进程提供 CLI 通信能力并且可以扩展自定义命令?
该过程本身是用c ++编写的
GDB 不使用 CLI 与其被调试者通信;它使用ptrace
系统调用/API。
CLI 的意思是“命令行界面”。进程之间最简单的通信形式是stdin
/ stdout
。这是通过管道实现的。例如:
ps -ef | grep 'httpd'
的标准输出ps
(将是一个进程列表)连接到 的标准输入grep
,后者将逐行处理该进程列表输出。
您是在编写这两个程序,还是想与一个已经存在的进程进行通信?我不知道“show total_messages_processed”在没有上下文的情况下是什么意思。
如果你只是想让程序传达一些状态,一个好的方法是dd
:向进程发送SIGUSR1
信号导致它转储其当前统计信息stderr
并继续处理:
$ dd if=/dev/zero of=/dev/null&
[1] 19716
$ pid=$!
$ kill -usr1 $pid
$ 10838746+0 records in
10838746+0 records out
5549437952 bytes (5.5 GB) copied, 9.8995 s, 561 MB/s
您是否考虑在您的进程中使用AF_UNIX套接字?还是D 总线?或使其成为 HTTP 服务器(例如使用libonion或libmicrohttpd),可能用于SOAP或RCP/XDR
阅读一些关于高级 Linux 编程或高级 Unix 编程的书籍;你肯定想使用(也许是间接的)一些像poll(2)这样的多路复用系统调用,也许在像libev这样的事件库之上。也许你想为此专门写一个线程。
如果不知道您在考虑什么样的流程,我们无法提供更多信息。您可能需要重新设计其中的某些部分。如果进程是一些传统的计算密集型的东西,它与 SMTP 服务器进程不同。特别是,如果您在流程中有一些事件循环,请使用并扩展它以进行监控。如果您没有任何事件循环(例如在传统的数字运算“批处理”应用程序中),您可能需要添加一个。
在这种情况下,我建议使用“fork”,它将当前运行的进程分成两个。父进程将读取标准输入、处理命令并能够处理两个进程之间共享的所有内存。从理论上讲,甚至可以跳过高级形式的进程间通信:锁、互斥体、信号量、信号、套接字或管道——但要做好准备,子进程不一定将其状态写入内存,而是将其保存在寄存器中。
在 fork 操作系统会复制进程局部变量,之后每个进程都有自己的内部状态——因此传递数据的最简单方法是分配“共享内存”。
还可以将信号处理程序写入子进程,该处理程序进入睡眠/等待状态并仅在另一个信号时退出——这样就可以有更多时间检查子进程的内部状态。这种方法的主要原理是不必让正在调试的进程意识到正在被调试:父进程和子进程共享相同的代码库,父进程实现必要的输出方法(格式化筛选?)和序列化数据等。