如何在核心处理程序中获取信息

时间:2018-09-10 22:21:10

标签: python linux coredump

我经历了Naming of core dump files

此文档说明了如何获取进程ID,主机名等。如果配置如下:

echo "|/var/core_interceptor/bin/hello %P %u %g %s %t %c %e %h %d %E %i %p" > /proc/sys/kernel/core_pattern

OR

echo "|/var/core_interceptor/bin/systemd-coredump %P %u %g %s %t %c %e %h %d %E %i %p" > /proc/sys/kernel/core_pattern 


#include <stdio.h>
#define FILE_NAME "/var/core_interceptor/bin/text.txt"
int main(int argc, char *argv[])
{
   int i = 0;
   FILE* file_ptr = fopen(FILE_NAME, "w");
   for (i = 0; i < argc; i++)
     fprintf(file_ptr, "\n%s", argv[i]);
   fclose(file_ptr);
   return 0;
}

hello.c除了将其写入文本文件外没有做任何其他事情。当我看到生成的文件时,我看到了所有带有值的参数,即我看到了实际的PID等。

但是,当我像这样配置python程序时:

echo "|/var/core_interceptor/bin/pyhandler.py %P %u %g %s %t %c %e %h %d %E %i %p" > /proc/sys/kernel/core_pattern

在创建的文件中我没有得到任何参数。

$ cat pyhandler.py 
#!/usr/bin/python

import sys
f = open("/var/core_interceptor/bin/text1.txt", "w")
f.write("Called")
f.write(sys.argv[0:])
f.close()

此py脚本被调用,但不显示args:

$ cat text1.txt 
Called

为什么我可以在C程序中获取args,而不能在python中获取?

1 个答案:

答案 0 :(得分:0)

您可能已经发现了这个问题,但是您的程序很可能引发异常,因为您正在将类型为list的参数提供给期望类型为str的方法。

示例程序:

cat arg_writer.py
#!/usr/bin/env python3.6

import sys

with open("/tmp/output.txt", "w") as output:
    output.write(sys.argv[0:])

执行:

./arg_writer.py
Traceback (most recent call last):
  File "./arg_writer.py", line 6, in <module>
    output.write(sys.argv[0:])
TypeError: write() argument must be str, not list
[crknight@tbs5g-dev-san-02 tmp]$ 

如果在编写之前将列表强制转换为字符串形式,则可能会得到所需的内容:

#!/usr/bin/env python3.6

import sys

with open("/tmp/output.txt", "w") as output:
    output.write(str(sys.argv[0:]))

示例输出:

cat /tmp/output.txt
['./arg_writer.py']