【发布时间】:2017-03-28 18:25:00
【问题描述】:
我正在为我的设备(如嵌入式设备)构建自定义内核 linux。我想记录 kill 系统调用的所有信息。所以我修改了kill系统调用中的代码并让pid杀死。但我无法获得完整的流程路径,我刚刚获得了当前流程的完整路径。 这是我从 pid 获取进程路径的代码。
long GetProcessPathFromPid(const pid_t p_id, char* pszProcessPath, int iSize)
{
struct task_struct *task = NULL;
struct pid *pid_struct = NULL;
struct mm_struct *mm = NULL;
//struct file *exe_file = NULL;
//char buf[256] = {0};
//char *result = ERR_PTR(-ENOENT);
//int iResultLength = 0;
pid_struct = find_get_pid(p_id);
if (pid_struct == NULL)
{
printk("Fail to find_get_pid.\n");
}
task = pid_task(pid_struct, PIDTYPE_PID); // Get task_struct
if (task == NULL)
{
printk("Fail to pid_task.\n");
}
mm = get_task_mm(task); // Get mm of task_struct
mmput(mm);
printk("Finish hook kill process\n.");
return 0; // Get mm of task_struct
}
这是我更新固件时的错误:
Call Trace:
[<8042971c>] printk+0x24/0x30
[<800c37c8>] GetProcessPathFromPid+0x38/0x88
[<800c3b60>] LogKillProcess+0x64/0xf4
[<800443d4>] sys_kill+0x30/0x1d8
[<800354b0>] do_wait+0x11c/0x220
[<8042e234>] wait_for_completion_killable+0x18/0x30
[<80043a3c>] set_current_blocked+0x30/0x48
[<80533210>] repair_env_string+0x0/0x94
[<8003664c>] sys_wait4+0x80/0xfc
[<800344d8>] child_wait_callback+0x0/0x8c
[<80533210>] repair_env_string+0x0/0x94
[<8001b59c>] stack_done+0x20/0x40
[<800b07a8>] sys_close+0x0/0x158
[<80533210>] repair_env_string+0x0/0x94
Call Trace:
[<8042fe88>] _raw_spin_lock+0x10/0x3c
[<8002ef68>] get_task_mm+0x20/0x7c
[<800c37c8>] GetProcessPathFromPid+0x38/0x88
[<800c3b60>] LogKillProcess+0x64/0xf4
[<800443d4>] sys_kill+0x30/0x1d8
[<8001b59c>] stack_done+0x20/0x40
Code: 24630001 af830014 3c020001 <c0830000> 00622821 e0850000 10a0fffc 00032c02 3063ffff
pe=GPON
---[ end trace aee100dae37dfc66 ]---
note: init[1] exited with preempt_count 1
FinWLmngr Daeish hook kill process
.mon is running
!!!! PLL locked !!!!!! !!!! RX CDR locked !!!!!! !!!! TX CDR locked !!!!!! GPON BEN Calibration Done
GPON SerDes Initialization Sequence Done
Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
你能帮帮我吗?谢谢!
【问题讨论】:
-
错误信息是什么(
if失败)? pid是什么?内核中有代码生成/proc/$PID/exe链接:lxr.free-electrons.com/source/fs/proc/base.c?v=4.8#L1556 fs/proc/base.cproc_exe_link- 使用get_proc_task/get_task_exe_file/path_get。 -
这不签出。你得到了错误的可执行路径,或者你得到了内核恐慌?
-
我无法使用该功能来查找完整路径过程,但我找到了解决它的方法。感谢您的支持!
标签: c linux-kernel