热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux内核死机堆栈,rtlinux运动实时内核死机调试方法

在Linux系统中提供实时内核死机调试方法,在系统中也给出了示例。示例存放路径是usrsrcrtlinu-3.1debugger目录,目录中的readm

在Linux系统中提供实时内核死机调试方法,在系统中也给出了示例。示例存放路径是/usr/src/rtlinu-3.1/debugger目录,目录中的readme文件详细说明了实时内核死机调试方法。其调试方法的主要内容是:先加载实时调试模块rtl_debug.o,然后加载实时内核模块,当实时内核模块出现导致死机的条件时,rtl_debug.o模块将其挂起,再使用gdb进行调试。

运动模块MillMotMod.o是一个插入Linux系统内核的实时模块,在其导致死机时,可以使用Linux系统提供的实时内核死机调试方法查找导致死机的原因。本文档即以查找MillMotMod.o模块导致死机的原因为例,分步骤详细说明调试方法如下:

1.将rtl_debug.o模块与gdb应用程序复制到数控系统的/GJMill/bin目录下。

rtl_debug.o模块源文件在服务器/usr/src/rtlinu-3.1/debugger目录下。

gdb应用程序源文件在服务器/usr/bin目录下。

注:

复制gdb应用程序文件到数控系统上的/GJMill/bin目录之后,要在/GJMill/bin目录下使用ldd gdb命令检查gdb依赖的库文件是否完整、匹配;若不完整,需要将相应的依赖文件从服务器复制到依赖的库文件存储的目录;若不匹配,需要寻找一个能与当前数控系统中共享库相匹配的gdb应用程序,一般从服务器寻找。这里所说的服务器是指制作数控系统的文件系统所使用的服务器。

2.查看rtl_debug.o模块依赖的设备文件/dev/rtf10是否存在,若不存在,建立这个设备文件。

建立这个设备文件的方法如下:

mknod

/dev/rtf10 c 150 10

命令中c表示/dev/rtf10为字符设备,150是主设备号,10是次设备号。

注:

/dev/rtf10为rtl_debug.o模块默认使用的设备,rtl_debug.o模块还可以使用/dev/rtf11或/dev/rtf12,这两个也是字符设备,主设备号都是150,次设备号分别为11与12。

3.在数控系统目录中创建gdb的工作目录。将生成运动模块MillMotMod.o的源代码复制到工作目录。

本文档创建的gdb的工作目录为/GJMill/rtl_gdb,使用如下命令创建:

cd /GJMill

mkdir rtl_gdb

注:

当重新生成运动模块MillMotMod.o,而源代码改变时,需要更新工作目录中的代码文件。

4.修改数控系统启动文件,加入在运动模块MillMotMod.o插入之前将内核调试模块rtl_debug.o插入系统内核的语句。

方法:

打开数控系统/GJMill/目录下的GJMill.run文件。在语句

# run motion in background

echo -n "starting SYSTEM MOTION

PROGRAM -- $mot..."

之前加入

/sbin/insmod /GJMill/bin/rtl_debug.o

注:

当rtl_debug.o模块不使用默认设备/dev/rtf10,而使用/dev/rtf11或/dev/rtf12时,

需要将GJMill.run文件中

/sbin/insmod

/GJMill/bin/rtl_debug.o

语句加入fifo=NN的参数,分别修改为

/sbin/insmod /GJMill/bin/rtl_debug.o fifo=11

/sbin/insmod /GJMill/bin/rtl_debug.o fifo=12

5.将运动代码中的看门狗报警去掉。

方法:

将文件control.c中的emcmotController函数中的update_watchdog()语句注释掉,即将语句变成

//update_watchdog();

6.修改运动代码的编译文件Makefile,在编译中加入ggdb选项,在连接时去掉S选项。编译,编译时加入RTL_GDB=1参数,生成用于调试的运动模块MillMotMod.o。将MillMotMod.o复制到数控系统/GJMill/bin目录下。

方法:

(1)修改文件Makefile

在语句

ifdef BUILD_REALTIMEONLY

之前加入

ifdef RTL_GDB

CFLAGS += -ggdb

endif

在语句

RT_MODULE_LIBCM_LINK_FLAG = -S -O3

smallmath.o

之后加入

ifdef RTL_GDB

RT_MODULE_LIBCM_LINK_FLAG := -O3

smallmath.o

Endif

(2)编译生成用于调试的运动模块MillMotMod.o

编译G3WPX版本的运动模块MillMotMod.o的命令如下:

touch

*

make GJ301=1 PULSE_MODE=1 RTL_GDB=1

PLAT=rtlinux_3_1

编译后可以看到生成的模块与不加RTL_GDB=1参数相比,大小增加了很多。

(3)将编译生成的模块MillMotMod.o复制到数控机/GJMill/bin目录下。

注:

gcc编译选项ggdb作用是在可执行程序中包含gdb特性的大量调试信息。使用gdb调试时必须加入此编译选项。

ld链接选项S(即--strip-debug)作用是忽略输出文件中所有的“调试符号”信息(但不是所有符号)。该选项控制在链接各个模块时,不将各模块中的“调试符号”信息链接到最终的目标文件中。在需要调试时,该选项必须关闭。

strip命令会抛弃目标文件中的符号信息,其对目标文件执行后目标文件修改后的效果与ld –S生成目标文件的效果相同。因此,需要调试时,必须保证目标文件没有使用strip命令处理过。

7.在PC机上使用SSH软件连接到数控系统,使用cat

/proc/kmsg命令建立一个打印终端,用于自动打印实时信息。

8.启动数控系统。启动过程中或操作过程中运动模块MillMotMod.o出现导致死机的条件时,rtl_debug.o模块会将运动模块MillMotMod.o挂起,MillMotMod.o模块停止在挂起位置。系统不会死机。

注:

此时,在SSH软件连接到数控系统的打印终端会出现类似以下内容的语句:

rtl_debug: exception 0xe in MillMotMod

(EIP=0xcfbadaa1), thread id 0xcc548000; (re)start GDB to debug

9.进入/GJMill/bin目录运行gdb,使用gdb调试MillMotMod.o模块。

方法(其中/*与*/之间为注释):

cd /GJMill/bin

./gdb MillMotMod.o

GNU gdb 5.0

Copyright 2000 Free Software Foundation,

Inc.

GDB is free software, covered by the GNU

General Public License, and you are welcome to change it and/or distribute

copies of it under certain conditions.

Type "show copying" to see the

conditions.

There is absolutely no warranty for

GDB.  Type "show warranty" for

details.

This GDB was configured as

"i386-redhat-linux"...

(gdb)    /*此时已进入到gdb应用程序,出现gdb应用程序标志*/

(gdb) cd /GJMill/rtl_gdb   /*修改gdb的工作目录。此目录为源代码存储目录,gdb调试过程从此目录寻找源代码。因此生成MillMotMod.o模块的源代码必须预先存入此目录*/

Working directory /GJMill/rtl_gdb.

(gdb) target remote

/dev/rtf10 /*指定实时内核远程调试设备*/

Remote debugging using /dev/rtf10

[New thread -866877440]

[Switching to thread -866877440]

tpScurveCalcuVEnd (tp=0xcfc041d4, thisTc=0xcfc09564,

t=1, nForesee=2) at tp.c:3380                                                             /*给出导致模块MillMotMod.o挂起的函数*/

3380     vStart

= tmpTc->initVel; /*给出导致模块MillMotMod.o挂起的代码信息*/

(gdb)    /*此时已将导致MillMotMod.o模块挂起的信息显示出来,之后,就可以使用gdb的命令进行分析调试。*/

……

……

……

……

……

……

(gdb) quit  /*退出gdb*/

注:

使用quit为正常退出,之后还可以使用同样方法进入gdb,重新调试。

MillMotMod.o模块挂起时,设置断点命令bre有效,但由于当前模块为挂起状态,当前行的程序语句即导致挂起的语句,因此,使用cont命令,next命令,step命令时,不会继续执行,而会提示错误,因此查看完挂起的信息,即可使用quit命令正常退出。

以下为MillMotMod.o模块挂起时调试常用的gdb命令,其他gdb命令请查阅gdb使用手册。

cd:改变工作目录。如cd

/GJMill/rtl_gdb

pwd:显示当前工作目录。

bt(backtrace):显示线程堆栈信息,即生成导致线程挂起(一般为段错误)的

函数树。

list:列出正在调试的程序的源代码。从线程挂起前5行开始显示代码。

list n:从第n行显示代码。

bre(break):设置断点。如bre

39为设置39行为断点。

tbre(tbreak):设置临时断点。语法与bre相同,但临时断点执行一次后立即消失。

cont(continue):继续执行。

next:执行下一条源代码,但是不进入函数内部。

step:执行下一条源代码,进入函数内部。

info bre(break):显示当前断点列表,包括每个断点到达的次数。

info files:显示调试文件的信息。

info func(function):显示所有的函数名。

info local:显示当前函数的所有局部变量信息。

info prog(program):显示调试程序的执行状态。

info threads:显示所有线程的概要信息。

gdb按顺序显示:

1.线程号(gdb设置)。

2.目标系统的线程标识。

3.此线程的当前堆栈。

前面打*的线程表示是“当前调试”线程。

thread THREADNO:把线程号为THREADNO的线程设为“当前调试”的线程。gdb

调试命令对“当前调试”的线程起作用。

print:显示表达式的值。如print

vStart。

del(delete):删除断点。指定一个断点号码,则删除指定断点。不指定参数,

则删除所有断点。

shell:执行Linux

Shell命令。例如:shell ls

q(quit):退出gdb应用程序

10.当运动模块MillMotMod.o未出现导致死机的条件,rtl_debug.o模块未将运动模块挂起时,

不能使用gdb进行调试。

注:

此时若使用gdb进行调试,在语句

(gdb)

target remote /dev/rtf10

执行时,会一直等待,只能用Ctrl+c退回到(gdb)提示符下,然后使用quit命令退出。若使用Ctrl+z退出,则会直接退出gdb应用程序,并且gdb进程使用kill指令也无法清除。

附录:/dev/rtf10设备说明

RTLinux用FIFO管道来在Linux进程或者Linux内核与实时进程间传递数据,这种管道称为实时管道(real-time FIFOs),以区别UNIX IPC机制中的管道。

RT-FIFO管道是在内核地址空间的。通过一个整数来引用。RT-FIFOs的数目在编译系统时给定,可以重新编译系统改变大小

操作RT-FIFOs的函数包括创建。删除。读FIFO和写FIFO。读写操作是原子操作,不能中断。不可中断是为了避免优先级倒置问题。

在Linux进程中,把RT-FIFOs当作普通的字符设备,而不是一个系统调用。字符设备给用户一个与实时任务通信的全功能的应用程序接口(API)。这个接口对Linux进程来说是标准的设备接口,包括:open, close, read和write。

struct

file_operations rtf_fops

static struct

file_operations rtf_fops =

{

rtf_llseek,

rtf_read,

rtf_write,

NULL,

rtf_poll,

NULL,

NULL,

rtf_open,

NULL,

rtf_release,

NULL,

NULL,

NULL,

NULL,

NULL

};

下面是原始的存取例程:

int

rtf_create(unsigned int minor, int size)

int

rtf_destroy(unsigned int minor)

int

rtf_put(unsigned int minor, void *buf, int count)

int

rtf_get(unsigned int minor, void *buf, int count)

对于每个FIFO管道可以通过

int

rtf_create_handler(unsigned int minor,

int (*handler)

(unsigned int fifo))

安装自己的处理程序,当数据从FIFO中读出或写出时运行。



推荐阅读
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 在上篇文章的基础上,本文将继续探讨 Linux 设备驱动中的设备模型与 `devicedriverbus` 机制。在将设备注册到总线之前,需要先创建 `device` 对象。可以通过静态定义 `device` 结构体变量,并调用 `device_register` 函数来完成这一过程。此外,文章还将详细解析设备模型的内部工作机制,以及 `devicedriverbus` 机制如何实现设备与驱动的自动匹配和管理。 ... [详细]
  • 本文详细介绍了使用响应文件在静默模式下安装和配置Oracle 11g的方法。硬件要求包括:内存至少1GB,具体可通过命令`grep -i memtotal /proc/meminfo`进行检查。此外,还提供了详细的步骤和注意事项,确保安装过程顺利进行。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 在 Red Hat 系统的启动过程中,首先运行的程序是 `/sbin/init`。该程序会读取 `/etc/inittab` 文件,并根据其中的配置进行系统的初始化工作。例如,它会根据设定的运行级别启动相应的服务和进程,确保系统能够顺利进入指定的运行状态。此外,`/sbin/init` 还负责管理系统关机和重启等操作,确保系统的稳定性和安全性。 ... [详细]
  • 使用 Vue 集成 iScroll 实现移动端表格横向滚动与固定列功能 ... [详细]
  • NanoPi2 使用体验深入解析(续篇)
    随着Raspberry Pi的问世,开源硬件领域迎来了前所未有的发展,激发了全球范围内的创新热潮。在中国,这一趋势同样催生了一系列类似的开发板,例如NanoPi 2。本文作为前篇的延续,将深入探讨NanoPi 2的实际使用体验,从性能、兼容性到应用场景,进行全面分析。 ... [详细]
  • Nginx入门指南:从零开始掌握基础配置与优化技巧
    Nginx入门指南:从零开始掌握基础配置与优化技巧 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • ESP32 IRAM 内存优化策略与实践总结
    本文总结了针对ESP32 IRAM内存溢出问题的优化策略与实践经验。通过详细分析ESP32的内存结构和IRAM分配机制,提出了一系列有效的解决方案,包括代码优化、内存管理技巧和编译器配置调整,旨在帮助开发者有效解决`.espressif/tools/xtensa-esp32-elf/esp-2`等类似错误,提升系统性能和稳定性。 ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
  • 前言: 网上搭建k8s的文章很多,但很多都无法按其说明在阿里云ecs服务器成功搭建,所以我就花了些时间基于自己成功搭建k8s的步骤写了个操作手册,希望对想搭建k8s环境的盆友有所帮 ... [详细]
author-avatar
CJT--陳嘉婷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有