linux 驱动调试问题记录

1、非root用户文件操作权限不够

文件属性 rwx rwx rwx — — —
sudo chmod 777 /dev/xxx
其中 R = 4, W = 2, X = 1
详细https://www.cnblogs.com/ccEmily/p/5672749.html

2、控制台不打印消息

sudo dmesg 详细https://blog.csdn.net/a29562268/article/details/78443087
但是通过改变printk的打印级别没有调试成功 echo 8 4 1 7 > /proc/sys/kernel/printk 其中数值都可以更改
cat /proc/sys/kernel/printk 查看 printk 的打印级别
printk 数值越小,优先级越高
详细https://blog.csdn.net/u012627502/article/details/39182713

通过ssh或者telent建立的远程登录的命令行无法接受printk的输出

3、自动创建模块节点

class_create()
device_create()

#include <linux/device.h>
static struct class *hellodrv_class;
#define    DEVICE_NAME     "HelloModule"
static dev_t devId;// int类型,高12位为主设备号,低20位为次设备号
int major;

devId = MKDEV(major, 0);
/* 在 /sys/class 下创建一个以 DEVICE_NAME 为名字的文件夹 */
hellodrv_class = class_create(THIS_MODULE, DEVICE_NAME);
/* 在 /sys/class/DEVICE_NAME 下创建 "hellodev" 文件 */
device_create(hellodrv_class, NULL, devId, NULL, "hellodev");

卸载:

device_destroy(hellodrv_class, devId);
class_destroy(hellodrv_class);

这里写图片描述

4、Makefile

原文:https://blog.csdn.net/xukai871105/article/details/36476793

三个C文件和三个头文件
文件结果如下:根目录中包含test.c makefileh和文件夹test-add和文件夹test-sub。
test.c makefile
【test-add】test-add.c test-add.h
【test-sub】test-sub.c test-sub.h

# 指令编译器和选项
CC=gcc
CFLAGS=-Wall -std=gnu99

# 目标文件
TARGET=test

# SRCS变量中,文件较多时可通过“\”符号续行
SRCS = test.c \
  ./test-add/test-add.c \
  ./test-sub/test-sub.c

# gcc指令可通过-I前缀指定头文件路径,特别说明./代表当前路径,../代表上一级目录 
INC = -I./test-add -I./test-sub

OBJS = $(SRCS:.c=.o)

# 链接为可执行文件
$(TARGET):$(OBJS)
    @echo TARGET:$@
    @echo OBJECTS:$^
[tab]$(CC) -o $@ $^

clean:
[tab]rm -rf $(TARGET) $(OBJS)

# 编译规则 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.c
[tab]$(CC) $(CFLAGS) $(INC) -o $@ -c $<

这里写图片描述
可以看出是先编译再链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
段错误是一种常见的错误类型,通常是由于访问无效的内存地址引起的。在调试 Linux 驱动程序时遇到段错误,可以按照以下步骤进行排查和解决: 1. 确认段错误的位置:可以使用调试工具(如 gdb)来定位段错误发生的位置。通过在代码中插入调试语句或设置断点,可以逐步执行程序并观察在哪个特定的代码行发生段错误。 2. 检查指针和数组:段错误通常与指针或数组的访问有关。确保您的指针已正确初始化并分配了内存。检查数组的索引是否超出了范围,并避免访问已释放的内存。 3. 检查内存分配和释放:如果您使用动态内存分配函数(如 malloc 或 kmalloc),请确保在使用完内存后进行适当的释放(free 或 kfree)。内存泄漏可能导致内存耗尽或无效的内存访问。 4. 检查函数参数和返回值:确保函数参数的类型和数量与函数声明匹配,并正确处理函数的返回值。传递无效的参数或对未初始化的返回值进行操作可能导致段错误。 5. 检查系统调用和驱动接口:如果您的驱动程序使用系统调用或与其他模块或设备进行交互,请确保正确处理错误情况和无效的参数。使用适当的错误处理机制,如返回适当的错误代码或设置错误标志。 6. 使用调试工具:除了 gdb 之外,还可以使用其他调试工具,如 Valgrind(用于检测内存错误)或 Ftrace(用于跟踪函数调用和内核事件)。这些工具可以帮助您更详细地分析和定位段错误。 7. 重现和记录问题:尝试重现段错误,并记录相关的环境、输入或操作。这将有助于更深入地分析问题并找到解决方案。 请注意,以上步骤只是一些常见的排查方法,具体的解决方案可能因问题的具体情况而异。如果问题仍然存在,请尝试搜索相关的文档、论坛或寻求其他开发者的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值