美文网首页程序员每天写1000字每周500字
求你了,下次不要问别人日志写在哪!(2)

求你了,下次不要问别人日志写在哪!(2)

作者: 刘思宁 | 来源:发表于2018-08-28 21:29 被阅读30次
from @unsplash

上次我们说到,有一些程序的日志可能写入到 pts 文件中,详情请回顾:

https://www.jianshu.com/p/ea3ff3c8302e

root@ubuntu:/proc/5651/fd$ sudo ls -Gg
total 0
lrwx------ 1 64 Aug 28 20:09 0 -> /dev/null
lrwx------ 1 64 Aug 28 20:09 1 -> /dev/pts/1

如果可以通过读取这个 pts 来收集日志就好了,但如果不能怎么办呢?

我们知道, stdout 的文件描述符(fd)一定是 1 。那么,想办法把别的文件的 fd 赋值为这个 1 ,然后这个程序的日志输出,就会切换到另外一个文件中了,而且是我们主动选择的一个文件,而不是 pts 这样不太熟悉的文件。而且不会中断原有的进程。

怎么做呢,我们需要两个工具:

gdb 是 GNU debugger,一个调试工具。底层是 c 的各种程序,他都可以调试,包括 nodejs,和 ruby。
另外,我们还需要一个 unix 操作系统提供的 c 方法,叫做 dup2,他是一个封装好的系统调用,大家可以在 man page 找到(man 2 dup2),作用就是复制一个文件描述符,并且附上一个新的值,比如我们想要的 1。

接下来,执行:

sudo gdb -p PID # PID is the process id you're working on

这样,我们就想用 gdb 工具,进入了一个进程的调试模式。

然后在 gdb 中,执行下面这个命令

p dup2(open("path/to/your/file", 1), 1)

这其实是在调用上面提到的 dup2,把 path/to/your/file 这个文件打开,并把他的文件描述符赋值为 1。

至于语法上为什么需要先写一个 p,这个我还不太清楚。

但此时,我们依然出现了对那个进程打断点的状态,我们需要执行 quit 退出 gdb,那个进程才能继续执行。

到这里,日志文件已经变为我们期待的文件了。但是,gdb 的作用其实不止于此,有机会的话我们可以继续讨论。

相关文章

  • 求你了,下次不要问别人日志写在哪!(2)

    上次我们说到,有一些程序的日志可能写入到 pts 文件中,详情请回顾: https://www.jianshu.c...

  • 求你了,下次不要问别人日志写在哪!

    很多人不愿意做伸手党,但有时候,我们却因为能力有限最终还是做了伸手党,怎么办? 最终的解决方案只有一个:提高能力,...

  • android系统日志

    先看下如下代码:主要就是try里边的2行代码。读取系统日志: 看到别人的代码里日志服务里就写的那个来读取日志了,就...

  • 代码不规范,同事两行泪,撸码七宗罪!

    编程江湖中一直盛传着一个段子,那就是要问程序员最讨厌哪 4 件事?那必须是:写注释、写文档、别人不写注释、别人不写...

  • 第五周作业

    每周俩首写绘 每天坚持练字 日志写的太乱了,下次一定好好 每天坚持阅读 数学作业也很认真

  • 尽量不要对别人作出评价

    尽量尝试拒绝别人,因为拒绝才是常态,每次都答应别人各种事情,只是给自己添麻烦,等到下次,别人还会得寸进尺地要求你做...

  • 尽量不要对别人作出评价

    尽量尝试拒绝别人,因为拒绝才是常态,每次都答应别人各种事情,只是给自己添麻烦,等到下次,别人还会得寸进尺地要求你做...

  • 尽量不要对别人作出评价

    尽量尝试拒绝别人,因为拒绝才是常态,每次都答应别人各种事情,只是给自己添麻烦,等到下次,别人还会得寸进尺地要求你做...

  • 尽量不要对别人作出评价

    尽量尝试拒绝别人,因为拒绝才是常态,每次都答应别人各种事情,只是给自己添麻烦,等到下次,别人还会得寸进尺地要求你做...

  • 求求你别再等下次了,他们真的等不起

    前几天十一小长假的时候,表哥一家人决定回老家待几天。因为平时工作很忙,工作地方离老家也很远,所以不常回来,和父母的...

网友评论

    本文标题:求你了,下次不要问别人日志写在哪!(2)

    本文链接:https://www.haomeiwen.com/subject/rthcwftx.html