linux环境下debug调试问题怎样才能做到最方便?像单片机可以直接重写printf(puts)函数,直接将打印输出到串口;而linux下的应用程序如何实现,问题困扰了我好久,最近恰好想到一个比较不错的解决方案,仅供参考;
需求:
1、应用程序可以通过终端操作将日志重定向到指定位置(包括指定log文件,ssh终端,串口终端等)
2、应用程序的打印日志可以通过命令调节打印等级;
3、整个方案不涉及内核修改,方便做跨平台开发;
设计:
考虑到进程要将自身IO重定向到未知终端,这里需要新开发一个工具(暂且称谓程序1),做进程间的通信;在需要时用户通过工具携带参数,工具程序通过进程间通信的方式通知主控程序(程序2)将IO重定向到何处;这也是本次方案的主要思想;主要有以下几个应用场景:
1、用户通过ssh登录,想查看程序2当前的运行情况,需要将程序2的IO重定向到当前ssh,实现方案是,运行程序1,程序1通过tty命令获取当前终端文件描述,并通过IPC的方式发送给程序2,程序二收到命令后,将IO重定向到对应的tty。(同样的方法适用于通过串口登录终端,不同的是tty文件是不同的)
2、用户想调整打印日志的等级,通过程序1携带参数透传给程序2,程序2对参数进行解析,并调整打印等级。
3、用户想获取进程运行期间的某些进程状态,通过程序1携带参数透传给程序2,程序2对参数进行解析,并将状态信息返回给程序1的tty;
其中23步骤的命令完全可做到程序1完全透传参数给到程序2解析,这样的方便扩展,例如以后再增加其他控制命令,则不必再修改程序1,只做程序2的解析即可;
扩展:
方案实现起来可能会用到的几个函数如下:
int dup2(int oldfd, int newfd);
用于将标准IO重定向到指定文件描述符;
size_t strftime(
char *strDest,
size_t maxsize,
const char *format,
const struct tm *timeptr
);
用于输出指定格式化时间字符串
int execl(const char * path, const char * arg, ...);
用来执行某个Liunx系统命令
几个接口只做了简单的描述,仅供参考。仅提出一个思路,具体实现自行设计