Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何消除内核编程中的分段错误?_C_Linux_Kernel Module - Fatal编程技术网

C 如何消除内核编程中的分段错误?

C 如何消除内核编程中的分段错误?,c,linux,kernel-module,C,Linux,Kernel Module,我在做内核编程时遇到了分段错误。我已经创建了一个名为process_list的字符设备。我在尝试从设备读取数据时遇到了分段错误。 导致分段错误的代码部分,即dev_read()如下所示: static ssize_t dev_read(struct file *filep, char *user_buffer, size_t len, loff_t *offset) { int error_count=0; if(error_count < 0) {

我在做内核编程时遇到了分段错误。我已经创建了一个名为process_list的字符设备。我在尝试从设备读取数据时遇到了分段错误。 导致分段错误的代码部分,即dev_read()如下所示:

static ssize_t dev_read(struct file *filep, char *user_buffer, size_t len, loff_t *offset)
{
    int error_count=0;
    if(error_count < 0)
    {
        return error_count;
    }
    for_each_process(task)
    {
                if (task->state == 0){snprintf(state_str,200,"%s", "TASK_RUNNING");}
                else if (task->state == 1){snprintf(state_str,200,"%s", "TASK_INTERRUPTIBLE");}
                else if (task->state == 2){snprintf(state_str,200,"%s", "TASK_UNINTERRUPTIBLE");}
                else if (task->state == 4){snprintf(state_str,200,"%s", "__TASK_STOPPED");}
                else if (task->state == 8){snprintf(state_str,200,"%s", "__TASK_TRACED");}
                else if (task->state == 16){snprintf(state_str,200,"%s", "EXIT_DEAD");}
                else if (task->state == 32){snprintf(state_str,200,"%s", "EXIT_ZOMBIE");}
                else if (task->state == 64){snprintf(state_str, 200,"%s","TASK_DEAD");}
                else if (task->state == 128){snprintf(state_str,200,"%s", "TASK_WAKEKILL");}
                else if (task->state == 256){snprintf(state_str,200,"%s", "TASK_WAKING");}
                else if (task->state == 512){snprintf(state_str,200,"%s", "TASK_PARKED");}
                else if (task->state == 1024){snprintf(state_str, 200,"%s","TASK_NOLOAD");}
                else if (task->state == 2048){snprintf(state_str,200,"%s", "TASK_NEW");}
                else if (task->state == 4096){snprintf(state_str,200,"%s", "TASK_STATE_MAX");}
        else if (task->state == (16 | 32)){snprintf(state_str, 200,"%s", "EXIT_ZOMBIE , EXIT_DEAD");}
                else if (task->state == (128 | 2)){snprintf(state_str, 200,"%s", "TASK_WAKEKILL , TASK_UNINTERRUPTIBLE");}
                else if (task->state == (128 | 4)){snprintf(state_str, 200,"%s", "TASK_WAKEKILL , __TASK_STOPPED");}
                else if (task->state == (128 | 8)){snprintf(state_str, 200,"%s", "TASK_WAKEKILL , __TASK_TRACED");}
                else if (task->state == (2 | 1024)){snprintf(state_str, 200,"%s", "TASK_UNINTERRUPTIBLE , TASK_NOLOAD");}
                else if (task->state == (1 | 2)){snprintf(state_str, 200,"%s", "TASK_INTERRUPTIBLE , TASK_UNINTERRUPTIBLE");}
                else if (task->state == (0 | 1 | 2 | 4 | 8 | 32 |16)){snprintf(state_str, 200,"%s", "TASK_RUNNING , TASK_INTERRUPTIBLE , TASK_UNINTERRUPTIBLE , __TASK_STOPPED , __TASK_TRACED , EXIT_ZOMBIE , EXIT_DEAD");}
                else if (task->state == (1 | 2 | 4 | 8)){snprintf(state_str, 200,"%s", "TASK_NORMAL , __TASK_STOPPED , __TASK_TRACED");}
                else {snprintf(state_str,200,"%s", "OTHER");}
        sprintf(kernel_buffer + strlen(kernel_buffer), "PID=%d  PPID=%d  CPU=%d  STATE=%s\n", task->pid, task->real_parent->pid, task_cpu(task),state_str);
        size_of_buffer = strlen(kernel_buffer);
    }
    error_count = copy_to_user(user_buffer, kernel_buffer, size_of_buffer);
    return error_count;
}
静态ssize\u t dev\u read(结构文件*filep,字符*user\u缓冲区,大小长度,loff\u t*offset)
{
int error_count=0;
如果(错误计数<0)
{
返回错误计数;
}
对于每个流程(任务)
{
如果(task->state==0){snprintf(state_str,200,“%s”,“task_RUNNING”);}
如果(任务->状态==1){snprintf(状态str,200,“%s”,“任务可中断”);}
如果(task->state==2){snprintf(state_str,200,“%s”,“task_不可中断”)}
如果(task->state==4){snprintf(state_str,200,“%s”,“__task_STOPPED”);}
如果(task->state==8){snprintf(state_str,200,“%s”,“__task_tracked”);}
如果(任务->状态==16){snprintf(状态为200,“%s”,“退出死亡”);}
如果(任务->状态==32){snprintf(状态为200,“%s”,“退出僵尸”)}
如果(task->state==64){snprintf(state_str,200,“%s”,“task_DEAD”);}
如果(任务->状态==128){snprintf(状态str,200,“%s”,“任务WAKEKILL”);}
如果(task->state==256){snprintf(state_str,200,“%s”,“task_唤醒”)}
如果(task->state==512){snprintf(state_str,200,“%s”,“task_PARKED”);}
如果(任务->状态==1024){snprintf(状态为200,“%s”,“任务未加载”);}
如果(任务->状态==2048){snprintf(状态str,200,“%s”,“任务新”);}
如果(task->state==4096){snprintf(state_str,200,“%s”,“task_state_MAX”)}
否则如果(任务->状态==(16 | 32)){snprintf(状态| str,200,“%s”,“退出|僵尸,退出|死亡”)}
否则如果(任务->状态==(128 | 2)){snprintf(状态| str,200,“%s”,“任务| WAKEKILL,任务|不可中断”);}
否则,如果(任务->状态==(128 | 4)){snprintf(状态str,200,“%s”,“任务唤醒,任务停止”)}
否则如果(任务->状态==(128 | 8)){snprintf(状态str,200,“%s”,“任务唤醒,任务跟踪”)}
否则如果(任务->状态==(2 | 1024)){snprintf(状态| str,200,“%s”,“任务|不间断,任务|空载”);}
否则如果(任务->状态==(1 | 2)){snprintf(状态str,200,“%s”,“任务可中断,任务不可中断”);}
否则如果(任务->状态==(0 | 1 | 2 | 4 | 8 | 32 | 16)){snprintf(状态str,200,“%s”,“任务正在运行,任务可中断,任务不可中断,任务已停止,任务已跟踪,退出僵尸,退出死亡”)}
否则如果(任务->状态==(1 | 2 | 4 | 8)){snprintf(状态str,200,“%s”,“任务正常”,“任务停止”,“任务跟踪”);}
else{snprintf(state_str,200,“%s”,“OTHER”);}
sprintf(内核缓冲区+strlen(内核缓冲区),“PID=%d PPID=%d CPU=%d STATE=%s\n”,任务->PID,任务->实父级->PID,任务CPU(任务),状态字符串;
缓冲区的大小=strlen(内核缓冲区);
}
错误\u计数=将\u复制到\u用户(用户\u缓冲区、内核\u缓冲区、大小\u缓冲区);
返回错误计数;
}

如果
kernel\u buffer
没有在某个地方初始化(它没有显示在发布的代码段中),那么
strlen(kernel\u buffer)
就可以在内存中永远运行,寻找一个空字符(零字节),从有效映射内存的末尾走出来。

建议使用case语句,而不是许多嵌套的“If else”。不是答案,但样式会更好。

那么,您是否尝试过定位分段错误发生的位置和时间?调用哪个参数
dev_read
,处理哪个任务(进程),代码中的哪一行触发错误?谢谢!我初始化了内核缓冲区,但我只是增加了它的长度,它帮助我解决了这个问题。