Linux如何启用Debug模式进行调试? (linux 怎么用debug模式)

在Linux系统开发的过程中,难免会遇到一些问题,如应用程序的崩溃、内核崩溃等等。这时候,开启Debug模式可以帮助我们定位问题。本篇文章将会介绍如何在Linux下启用Debug模式进行调试。

一、为什么需要Debug模式?

我们都知道,在大型的软件开发项目中,为了提高开发效率和编写质量,一般都会采用模块化开发。但是,这样做也会带来一些问题。例如,一个模块的代码里出现了问题,我们并不知道问题的具置和原因,这时候就需要Debug模式进行调试。Debug模式可以让我们看到每一个变量、函数和程序执行流程,从而能够准确找到问题。

二、Linux下的Debug模式

Linux和其他操作系统一样,内部都包含了一些调试工具。与Windows下的Visual Studio不同,Linux下的Debug工具分散在各种软件包里,有些工具需要自行编译安装。在使用Linux进行开发时,我们需要了解以下几方面的知识:

1.开启Debug信息

将Debug信息包含在可执行文件中,可以查看每个函数的调用情况,同时提供了一些有助于定位问题的信息。在编译时开启Debug选项,即使用gcc或者其他的编译器,在命令行中添加“-g”参数。例如:

$ gcc -g myapp.c -o myapp

这样就可以将Debug信息包含在可执行文件myapp中了。

2.调试器

Linux下有很多调试器可供选择,例如gdb、kdb、strace、ltrace等等。其中最常用的是gdb调试器。我们可以在开发过程中,利用gdb调试器来监视进程的运行情况,并在程序发生错误时进行定位。例如:

$ gdb myapp

在进入gdb后,我们可以使用一系列命令尝试查找问题。

3.内核调试

内核调试通常是在出现内核崩溃或挂起时进行的。可以使用内核的kdb或kgdb工具进行调试。若我们想在内核调试中使用gdb调试器,就需要使用kgdb。底下将以kgdb为例,介绍Linux内核的调试过程:

(1)安装kgdb插件

$ sudo apt-get install linux-image-$(uname -r)-dbg

(2)将内核信息打印到控制台

使用echo命令将一个变量的值输出到系统日志中,这样在调试时,可以看到这条语句被执行后变量的取值。

$ echo 1 > /proc/sys/kernel/printk

(3)准备好调试环境

重启系统时,在grub初始界面按下“e”键,进入编辑模式,在启动默认的kernel时,加上“kgdbwt kgdboc=ttyS0,115200”,保存后启动。这时候,在设备管理器中可以看到一个ttyS0的串口,即可在连接该串口时使用gdb进行调试。

三、针对不同的问题使用不同的调试工具

目前我们介绍了gdb、kdb、strace、ltrace等调试工具,这些工具各自有其优缺点,使用场景也不同。下面分别介绍它们的使用场景:

1.gdb

gdb是最常用的调试器,其主要优点是强大和高效,它可以针对不同的问题,在调试时提供不同的工具。例如,针对崩溃问题,可以使用Core文件调试;针对CPU过高问题,可以使用Profiling调试;针对内存泄漏问题,可以使用Valgrind调试等。gdb还提供了许多非常有用的命令,例如“bt”查看调用栈、“watch”监视变量值等等。

2.kdb

kdb是Linux内核的调试工具,它内嵌在内核中,可以在内核崩溃或挂起时使用。kdb的优点在于它可以直接操作内核,可以更加方便快捷地定位问题。同时,使用kdb时,只需要通过常规串口进行操作,与使用gdb时,需要连接调试卡相比,操作简单方便。

3.strace

strace是一种跟踪应用程序的系统调用的工具。它可以显示应用程序运行时和系统交互的细节。strace的主要优点在于它可以跟踪应用程序在运行时发生的事件,例如文件I/O,进程创建,网络操作等等。使用strace可以帮助我们找到应用程序在运行时出现的错误。

4.ltrace

ltrace也是一种跟踪应用程序的工具,但是不同于strace,ltrace的主要目标是跟踪应用程序使用的库函数。与strace相比,ltrace输出的信息更为具体,可以让我们更轻松地找到问题。

四、

本文介绍了Linux下的Debug模式,以及如何启用Debug模式进行调试。在实际开发中,我们需要针对不同的问题,使用不同的Debug工具。通过深入学习和了解这些工具的使用,可以帮助我们更快速、更准确地找到问题,提高代码质量和开发效率。

相关问题拓展阅读:

如何在Android 或Linux 下,做Suspend /Resume 的Debug

在Linux或Android下,做power management 的调适时,常遇到没有足够的information,可以做为debug时的依据和参考

我们整理了几个常用的参数或Command,可供设计者,得到足够的Informaiton 做Suspend / Resume的function Debug。

加boot 参数 no_console_suspend

基本上我们常常使用console做为suspend function的debug的Information source,但原始的source code在suspend过程中,会将console关掉。所以我们扰锋看到一定程度後就再也看不到message了。

但是我们并不知道在Suspend的过程中老李配,系统到底发生了什麼事,可能造成无法suspend。

为此,我们就会在kernel 启动参数中加上no_console_suspend这个参数。在AM/DM37x APM中是修改boot.scr档案参数

#!/bin/sh

cat boot.cmd

if fatload mmcuImage

then

echo ***** Kernel: /dev/mmcblk0p1/uImage *****

fi

echo ***** RootFS: /dev/mmcblk0p2 *****

# Pantherboard DVI output

#setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=dvi vram=32M omapfb.mode=dvi:1280x720MR-32 omapfb.vram=0:16M mpurate=1000’

# Pantherboard LCD output

setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000’

将no_console_suspend加上去到boot 参数後就好了

setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 no_console_suspend’

如果是OMAP4 APM的话,请修改Kernel 参数的所在档案即可(在U-boot Source code中)

这个是基本的参数,所以在Android或Linux上都可以使用。 kernel把console suspend掉侍指以後, 不管里面出了什麼事情, 在Console上都看不到。 而使用这个参数後,大部分在suspend/resume时候的死机都可以通过Console看到kernel Panic的信息, 这样我们才会知道是哪里出了问题。 因为有的时候resume出错, 或者suspend到很後面出错的console不加这个参数都看不到。

但这个参数在TI OMAP3/OMAP4/AM37x/DM37x有可能造成有时Suspend 完当掉或是resume 失败的问题,假如已经抓到问题在那的时候,您就可以将这个参数Disable,不然很可能就会Debug不下去。

initcall_debug

这个同样kernel参数,使用的时机是,当我们不知道是那个driver在suspend/resume过程中出错的时候,可以使用这个参数来找出问题所在。在下完这个参数後,Kernel在suspend时,会将每个driver或task的状况report出来。我们可以藉由这些information,Check 在suspend时,每个task和driver是否已经完成进suspend 的相关准备工作…

打开这个参数的方法有二种

一种是在console下Command,启动这个function…

echo 1 > /sys/module/kernel/parameters/initcall_debug

echo 9 > /proc/sys/kernel/printk

其中上面的之一条命令是打开initcall_debug, 这个是所有的kernel都会有的。

而第二条命令是要提高kernel message 级别,因为initcall的这些信息都是KERN_DEBUG级别的, 所以需要提高printk的级别才可以看到, 要不然suspend/resume的时候挂了,你就没有机会看到这些信息了。

另一种启动方法是写在kernel的启动参数下,就可以了。

setenv bootargs ‘console=ttyO2,115200n8 androidboot.console=ttyO2 mem=512M root=/dev/mmcblk0p2 rw rootfstype=ext3 rootdelay=1 init=/init ip=off omap_vout.vid1_static_vrfb_alloc=y omapdss.def_disp=lcd omapfb.mode=lcd:800x480MR-32 vram=8M omapfb.vram=0:8M mpurate=1000 initcall_debug no_console_suspend’

同样的,这个参数也有可能造成AM37x/DM37x/OMAP4 APM发生进suspend当掉的问题。所以一旦知道问题所在,麻烦请将这个参数Disable掉。

suspend_test

这个方法可以用rtc这种软件的方式来做循环的suspend/resume, 尽管对於Android这样并不是很足够, (还要再模拟一个POWER_KEY上去才够), 但是对於测试Driver的稳定性, 还是有一定用处的。不要认为suspend了几次可以,那麼就可以通过几千次的测试。这个suspend是5秒钟用RTC唤醒,然後回到Android後5秒钟又会自动睡下去,但是对於通用Linux,你可以写个script来让他起来一会再睡下去,或许这个工具比较有用rtcwakeup(google rtcwakeup)。

使用方法:

编译一个有这个功能的kernel, make menuconfig 以後选上

CONFIG_PM_DEBUG=y

CONFIG_PM_TEST_SUSPEND=y

这两个选项,烧写新的kernel,然後打开你需要测试的Device, 比如WIFI,3G

echo “core” > /sys/power/pm_test

echo “mem” > /sys/power/state

这样, 它就会循环休眠和唤醒了。

wakelock

Android和Linux在Power Management相关的更大的就是wakelock机制的有无。Android有时候会碰到suspend进不去,或者suspend到最後又莫名奇妙的wake up的问题。这些都有可能是wakelock引起的,或者说是wakelock的使用者引起的。怎麼fine tune呢,使用Console在Android 系统下设定:

echo 15 > /sys/module/wakelock/parameters/debug_mask

echo 15 > /sys/module/userwakelock/parameters/debug_mask

15是代表16进制的F, 在wakelock里面就是把所有的debug信息打开, 起码现在是这样设定的。如果以後不够用了,可能就会改成255.

这样你能看到kernel和frameworks层对於wakelock的操作、申请及释放。这样看申请和释放成对否就可以了。

注意: wakelock有一种是timeout的,就是说多少毫秒以後,会自动释放,对於这些wakelock,申请和释放可能是不成对的。

power.0

有时看到系统suspend到了最後, 然後遇到power.0後suspend失败,然後整个系统又resume回来。这个是android专有的,因为power.0是android注册到suspend最後的一个行程, 它会在CPU进入suspend之前检查一下有没有wakelock存在, 如果这时候还有没有释放的wakelock, 那麼它会return -EBUSY然後导致整个suspend失败。 Check这个问题的方法就是把上面wakelock的debug信息打开,然後看看是哪个去申请了wakelock,然後Release它。

这个错误的错误信息大概是这样的:

pm_noirq_op(): platform_pm_suspend_noirq+0x0/0x38 returns -11

PM: Device power.0 failed to suspend late: error -11

earlysuspend

在android里面中另外一个和Power Management有相关的机制叫earlysuspend, 同样可以打开debug message,用来做Android earlysuspend debug之用:

echo 15 > /sys/module/earlysuspend/parameters/debug_mask

来把相关的debug信息印出来, 例如那个earlysuspend要被call之类的。

suspend/resume 时间 fine tune

有的时候你要调试suspend/resume的时间太慢的问题。 一种方法是用initcall_debug, 然後把printk的时间戳打上, 然後看那个process最慢,再来Check原因是什麼

我有一个patch,专门用来调试这个问题的,但是upstream不接受, 说非要用这种折磨人的方法才行, 但是如果你想用可以下下来打上去用一下。

地址在这里:

用法是, 打上这个PATCH以後, 在KERNEL里面选择上PM_DEBUG, SUSPEND_DEVICE_TIME_DEBUG 这两个选项。

然後

echo

微秒

> /sys/power/device_suspend_time_threshold

比如

echo> /sys/power/device_suspend_time_threshold

注意这里是微秒哦。 。 。 它会把在suspend/resume的时候慢的那些driver打出来,然後你去干掉它。 。

嵌入式linux怎么检内存泄漏雨

检测内存泄露主要有以下5种方法:

1、在需要内存泄漏检查的代码的开始调用void mtrace(void) (该函数在头文件mcheck.h中有声明)。mtrace为malloc等函数安装hook,用于记录内郑返存分配信息.在需要内存泄漏检查的代码的结束调用void muntrace(void)。

注意: 一般情况下不要调用muntrace, 而让程序自高丛游然结束. 因为可能有些释放内存代码要到muntrace之后才运行.

2、用debug模式编译被检查代码(-g或-ggdb)。

3、设置环境变量MALLOC_TRACE为一文件名, 这一文件将存有内存分配信戚销息。

4、运行被检查程序, 直至结束或muntrace被调用。

5、用mtrace命令解析内存分配Log文件($MALLOC_TRACE)

(mtrace foo $MALLOC_TRACE, where foo is the executible name)

如果有内存泄漏,mtrace会输出分配泄漏

内存的代码位置,以及分配数量。

如何打开linux下apache tomcat 的debug端口 (转)

修改apache tomcat的bin目录下的文件catalina.sh在java_opts中增加:JAVA_OPTS=”$JAVA_OPTS -server -Xdebug -Xnoagent -Djavpiler=NONE -Xrunjdwp:transport=dt_socket,address=4050,server=y,suspend=n” 重新启动apache tomcat即可1、以下为apache学习:apache启动时报:Syntax error on line 90 Invalid command ‘Order’, perhaps mis-spelled or defined by a module not included in the server configuration,apache无法启动如何处理其原因是apache权限相关的module没有加载,导致其不认识Order这个命令,解决方案:在httpd.conf中添加LoadModule access_module /usr/alibaba/httpd/modules/mod_access.so2、这个错误时由改枣于共享内存被占用引起的,解决的方式是,先用ipcs命令获取Shared Memory Segments的shmid,然后使用ipcrm -m $shmid 的方式升歼没将共享内存释放3、如何查吵纳看当前应用的apache端口号是否被占用netstat -nlp |grep 端口号,可以查看当前端口号是否被占用。

linux 怎么用debug模式的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 怎么用debug模式,Linux如何启用Debug模式进行调试?,如何在Android 或Linux 下,做Suspend /Resume 的Debug,嵌入式linux怎么检内存泄漏雨,如何打开linux下apache tomcat 的debug端口 (转)的信息别忘了在本站进行查找喔。


数据运维技术 » Linux如何启用Debug模式进行调试? (linux 怎么用debug模式)