医保核实程序:Linux内核实时调试是如何完成的 使用了哪些工具

关于医保核实程序的问题,在linux debug kernel中经常遇到, 最常见的是什么,为什么不常见的方法和工具不用于在 Linux 内核上进行实时调试?

最常见的是什么,为什么不常见的方法和工具不用于在 Linux 内核上进行实时调试?

我知道Linus,例如,is againstLinux 内核的这种调试或者至少是这样的,因此在那些年里没有做任何事情,但老实说,自 2000 年以来已经过去了很多时间,我感兴趣的是,这种心态是否已经改变了 Linux 项目,以及目前使用什么方法在 Linux 内核上进行实时调试(本地或远程)?

欢迎参考有关上述技术和工具的演练和教程。

30

另一种选择是使用ICEJTAG控制器和 GDB。这种“硬件”解决方案特别适用于嵌入式系统。

但例如QEMU提供了类似的功能:

使用 GDB“remote”存根启动 QEMU,该存根侦听“localhost:1234”:qemu -s ...

然后使用 GDB,您打开编译有调试信息的内核文件vmlinux(您可以查看this mailing list thread,其中讨论了内核的未优化)。

连接 GDB 和 QEMU:target remote localhost:1234

请参阅live内核:

  (gdb) where
  #0  cpu_v7_do_idle () at arch/arm/mm/proc-v7.S:77
  #1  0xc0029728 in arch_idle () atarm/mach-realview/include/mach/system.h:36
  #2  default_idle () at arm/kernel/process.c:166
  #3  0xc00298a8 in cpu_idle () at arch/arm/kernel/process.c:199
  #4  0xc00089c0 in start_kernel () at init/main.c:713

不幸的是,到目前为止,使用 GDB 无法进行用户空间调试(没有任务列表信息,没有memory management unit重新编程以查看不同的进程上下文,...),但是如果您留在内核空间中,那将非常方便。

info threads将为您提供不同CPU的列表和状态

您可以在此 PDF 中获得有关该过程的更多详细信息:

Debugging Linux systems using GDB and QEMU.
26

在调试 Linux 内核时,我们可以使用多种工具,例如,调试器(KDB 和KGDB),崩溃时转储(LKCD),跟踪工具包(LTT,LTTV 和 LTTng)以及自定义内核工具(dprobes 和 kprobes)。

LKCD(Linux 内核崩溃转储)工具允许 Linux 系统在发生崩溃时写入其内存的内容。这些日志可以进一步分析崩溃的根本原因。有关 LKCD 的资源:

http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/lkcd.pdf https://www.novell.com/coolsolutions/feature/15284.html HOWTO:Configure lkcd to capture a kernel core dump

Oops:当内核检测到问题时,它将打印 Oops 消息。这样的消息是由错误处理程序(arch / * / kernel / traps.c)中的printk语句生成的。printk 语句正在使用内核中的专用环形缓冲区。Oops 包含有关 Oops 发生的 CPU,CPU 寄存器的内容,Oops 的回溯

https://www.kernel.org/doc/Documentation/oops-tracing.txt http://madwifi-project.org/wiki/DevDocs/KernelOops DebuggingKernelOops

Dynamic Probes是由 IBM 开发的流行的 Linux 调试工具之一。该工具允许在用户和内核空间中的系统中的几乎任何位置放置“探针”。探针由一些代码(用专门的,面向堆栈的语言编写)组成,这些代码在控件到达给定点时执行。列出了有关动态探针的资源:

http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaax/dprobesltt.pdf Generalized dynamic probes for the Linux kernel and applications with Arachne

Linux Trace Toolkit是一个内核补丁和一组相关实用程序,允许跟踪内核中的事件。跟踪包括定时信息,可以创建在给定时间段内发生的事情的合理完整的图片。LTT,LTT Viewer 和 LTT Next Generation 的资源

Linux Trace Toolkit The Linux Trace Toolkit Introduction to Linux Tracing Toolkit

MEMWATCH是一个开源内存错误检测工具。它的工作原理是在 gcc 语句中定义 MEMWATCH,并在我们的代码中添加一个头文件。通过这个我们可以跟踪内存泄漏和内存损坏。有关 MEMWATCH 的资源

Memory Leak Detection in Embedded Systems

ftrace是 Linux 内核的一个很好的跟踪框架。ftrace 跟踪内核的内部操作。该工具包含在 2.6.27 中的 Linux 内核中。通过其各种插件,ftrace 可以针对不同的静态跟踪点,例如调度事件,中断跟踪,内存映射的 I / O,CPU 电源状态转换以及与文件系统和虚拟化相关的操作。此外,还可以选择使用内核函数调用的动态跟踪

ltrace是 Linux 中的调试实用程序,用于显示用户空间应用程序对共享库的调用。该工具可用于跟踪任何动态库函数调用。它拦截并记录被执行进程调用的动态库调用和该进程接收的信号。它还可以拦截并打印程序执行的系统调用。

http://www.ellexus.com/getting-started-with-ltrace-how-does-it-do-that/?doing_wp_cron=1425295977.1327838897705078125000 http://developerblog.redhat.com/2014/07/10/ltrace-for-rhel-6-and-7/

KDB是 Linux 内核的内核调试器。KDB 遵循简单的 shell 式界面。我们可以用它来检查内存、寄存器、进程列表、 dmesg,甚至设置断点以停止在某个位置。通过 KDB,我们可以设置断点并执行一些基本的内核运行控制 (尽管 KDB 不是源代码级别的调试器)。关于 KDB 的几个方便的资源

Linux Kernel Debugging(Dr.Dobb's Journal,2005-11-01) KDB http://dev.man-online.org/man1/kdb/ Chapter 4.Using kdb

KGDB打算用作 Linux 内核的源代码级别调试器。它与 gdb 一起用于调试 Linux 内核。使用 kgdb 需要两台机器。其中一台机器是开发机器,另一台是目标机器。要调试的内核在目标机器上运行。期望可以使用 gdb 来“闯入”内核,以类似的方式调用内存,并通过

Using kgdb,kdb and the kernel de internals
21

根据the wikikgdb在 2.6.26 中被合并到内核中,这是最近几年内的。kgdbremote de,所以您activate it in your kernel然后以某种方式将 GDB 附加到它。我以某种方式说,因为似乎有很多选择-请参阅connecting GDB

所以看起来莱纳斯让步了。然而,我要强调他的论点 — — 你应该知道你在做什么,并且很好地了解系统。这是内核领域。如果出了什么问题,你不会得到分割错误;你会得到任何东西,从后来的一些模糊问题到整个系统的崩溃。这里是龙。小心行事;你已经被警告过了。

16

“实时”调试的另一个好工具是kprobesDynamic Probes

这使您可以动态构建在执行某些地址时运行的小模块-有点像断点。

它们的最大优点是:

它们不会影响系统-即,当一个位置被击中-它只是执行代码-它不会停止整个内核。

您不需要像KGDB那样互连两个不同的系统(目标和调试)

这是最好做的事情,如击中一个断点,看看数据值是什么,或检查的东西已经改变 / 覆盖等,如果你想“一步通过 code”-它不这样做。

另一个非常强大的方法是一个简单地称为“perf”的程序,它可以卷起许多工具(如动态探针)并替换 / 弃用其他工具(如 oprofile)。

特别是,perf probe命令可用于轻松地创建动态探针 / 将其添加到系统中,之后perf record可以对系统进行采样并报告信息(和回溯)。当通过perf report(或perf script查看更多信息)命中探针进行报告时。如果您在内核或 Google 上有良好的调试符号,则可以从系统中获得出色

perf Examples

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(79)
Centos7没有网络:Centos7 docker-py似乎没有安装
上一篇
Proxy:NGINX proxy_pass或proxy_redirect
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(67条)