从调试器中获取函数调用关系。
Rustlings 是由 Rust 团队维护的开源项目,旨在帮助你通过调试代码的方式来学习 Rust。
即使是复杂的函数,也有几种方法可以单步调试,所以下次在排除代码故障时,可以尝试一下这些 GDB 技术。
一篇论文(《建立一个调试教学的框架》)对我们有效调试所需的不同种类的知识/技能进行了分类
调试 Web 服务器的一种方法是使用 wget 命令行程序。
使用 GNU 调试器来解决你的代码问题。
了解如何处理转储文件将帮你找到应用中难以重现的 bug。
用这个微软的开源工具,获取进程信息。
Delve 是能让调试变成轻而易举的事的万能工具包。
了解如何使用 gdb 的一些鲜为人知的功能来检查和修复代码。
随着 Undo 发布 Live Recorder 5.0,这使得在多进程系统上的调试变得更加轻松。
了解一些技巧助你减少代码查错时间。
ptrace(2)(“进程跟踪”)系统调用通常都与调试有关。它是类 Unix 系统上通过原生调试器监测被调试进程的主要机制。它也是实现 strace(系统调用跟踪)的常见方法。
你也许用过调速器检查过你的代码,但你知道它们是如何做到的吗?
在看完这篇博客后,你应该知道如何从“哦,我的程序出现段错误,但我不知道正在发生什么”到“我知道它出现段错误时的堆栈、行号了! ”。
这里有一些我最喜欢的 Python 调试技巧。
这个简单优雅的模块可以让你包含调试或仅用于开发环境的代码,而在产品环境中隐藏它们。
我发现我可以从 gdb 上调用 C 函数。这看起来很酷,因为在过去我认为 gdb 最多只是一个只读调试工具。
最近,我使用 gdb 来查看我的 Ruby 程序,所以,我们将对一个 Ruby 程序运行 gdb 。
我写了一个 hello world 小脚本。我如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢?
调试 C 程序,曾让我很困扰。然而当我之前在写我的操作系统时,我有很多的 Bug 需要调试。我很幸运的使用上了 qemu 模拟器,它允许我将调试器附加到我的操作系统。这个调试器就是 gdb。
通常开发者要求提供 “回溯(backtrace)” 形式的数据,以显示导致崩溃的指令流。开发人员可以使用它来修复 bug 以改进系统。
我将对调试中的一些更高级的概念进行高层的概述:远程调试、共享库支持、表达式计算和多线程支持。这些想法实现起来比较复杂,所以我不会详细说明如何做
变量是偷偷摸摸的。有时,它们会很高兴地呆在寄存器中,但是一转头就会跑到堆栈中。
有一个 backtrace 命令,它给你提供了程序当前的函数调用链。这篇文章将向你展示如何在 x86_64 上实现堆栈展开以生成这样的回溯。
本文整理自《Debugging with GDB: the GNU Source-Level Debugger for GDB (GDB)》
上一篇博文中我们给调试器添加了一个简单的地址断点。这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器、观察状态和改变程序的行为。
Shell 脚本编程 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 系统管理员要处理着自动化任务,且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。
我将为大家展示 Linux 中调试器的主要构成模块 - ptrace 系统调用。这篇文章所有代码都是基于 32 位 Ubuntu 操作系统。值得注意的是,尽管这些代码是平台相关的,将它们移植到其它平台应该并不困难。
本文将解释第三种 shell 脚本调试模式,即 shell 跟踪,并查看一些示例来演示它如何工作以及如何使用它。
在本系列的这一部分,我们将了解如何使用语法检查调试模式。记住我们之前在本系列的第一部分中解释了不同的调试选项,在这里,我们将使用它们来执行脚本调试。
开发者们通常用来生成警告的 -Wall 选项,并不包括一些特殊的警告。如果你不了解这些特殊警告,并且不知道如何生成它们,不用担心,我将在这篇文章中详细讲解关于它们所有的细节。
在 Linux 系列中这篇介绍 Shell 脚本调试, 我们将看看如何启用 Shell 脚本调试,然后在之后的系列中解释不同的 Shell 脚本调试模式以及如何使用它们。
你知道,你可以让 gcc 保存每个编译阶段的输出吗?你知道用于生成警告的 -Wall 选项,它并不会包含一些特殊的警告吗?gcc 的很多命令行选项都不会经常用到,但是它们在某些特定的情况下会变得非常有用,例如,当你在调试代码的时候。
在这些工具集中,我评估了五款支持 Linux 的、流行的、自由开源的内存调试器: Dmalloc 、 Electric Fence 、 Memcheck 、 Memwatch 以及 Mtrace 。
如果你读过我写的使用GDB命令行调试器调试C/C++程序,你就会明白一个调试器对一段C/C++程序来说有多么的重要和有用。然而,如果一个像GDB这样的命令行对你而言听起来更像一个问题而不是一个解决方案的话,那么你也许会对Nemiver更感兴趣。Nemiver 是一款基于 GTK+ 的用于C/C++程序的图形化的独立调试器,它以GDB作为其后端。最令人赞赏的是其速度和稳定性,Nemiver是一个非常可靠,具备许多优点的调试工具。 Nemiver的安装 基于Debian发行版,它的安装时非常直接简单,如下: $ sudo apt-get install nemiver 在Arch Linux中安装如下: $
根据定义,调试工具是那些那些使我们能够监测、控制和纠正其他程序的程序。我们为什么应该用调试工具呢? 在有些情况下,运行一些程序的时候我们会被卡住,我们需要明白究竟发生了什么。 例如,我们正在运行应用程序,它产生了一些错误消息。要修复这些错误,我们应该先找出为什么产生这些错误的消息和这些错误消息从哪里产生的。 一个应用程序可能突然挂起,我们必须了解其他什么进程同时在运行。我们可能还必须弄清楚某个进程挂起的时候在做什么。为了剖析这些细节, 我们需要调试工具的帮助。 (题图来自:axxomovies.org) 有几个Linu
没有调试器的情况下编写程序时最糟糕的状况是什么?编译时跪着祈祷不要出错?用血祭召唤恶魔帮你运行程序?或者在每一行代码间添加printf("test")语句来定位错误点?如你所知,编写程序时不使用调试器的话是不方便的。幸好,linux下调试还是很方便的。大多数人使用的IDE都集成了调试器,但 linux 最著名的调试器是命令行形式的C/C++调试器GDB。然而,与其他命令行工具一致,DGB需要一定的练习才能完全掌握。这里,我会告诉你GDB的基本情况及使用方法。 安装GDB 大多数的发行版仓库中都有GDB Debian 或 Ubuntu $ sudo apt-get install gdb
在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用。当你想知道程序和操作系统如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执行。 这个简单而又强大的工具几乎在所有的Linux操作系统上可用,并且可被用来调试大量的程序。 命令用法 让我们看看strace命令如何追踪一个程序的执行情况。 最简单的形式,strace后面可以跟任何命令。它将列出许许多多的系统调用。一开始,我们并不能理解所有的输出,但是如果你正在寻找一些特殊的东西,那么你应该能从输出中发现它。 让我们来看看简单命令ls
Linux 内核补丁测试 你试过自己写内核补丁吗?本节介绍在把你的补丁包提交到 Linux 邮箱列表之前,需要做哪些操作。另外我们还会介绍如何把它发送出去。 写好代码后,编译它。把 make 过程产生的输出保存到文档中,查看新代码有没有警告信息。找到所有的警告信息,处理掉。当你的代码编译过程没有任何不正常的输出,安装这个内核,然后启动测试。如果启动正常,查看 dmesg 里面有没于错误,与老内核生成的 dmesg 日志做个比较。运行一些压力测试,请参考我们以前讲过的测试内容。如果这个补丁用于修复某个 bug,请确保真的已经修复了。如
仿真环境下进行 Linux 电源管理子系统测试 Linux 电源管理子系统在仿真环境下提供5种测试方式。这些方式仅仅在内核各层之间运行休眠的代码而不是真正的让系统进入休眠状态。有些平台不能挂起系统,比如说我们需要模拟飞机的飞行环境,这时候使用这种仿真环境就非常有用处了。 freezer - 测试停掉处理器: echo freezer /sys/power/pm_test echo platform /sys/power/disk echo disk /sys/power/state devices - 测试停掉处理器以及挂起设备: echo devices /sys/power/pm_test echo platform /sys/power/disk echo disk /sys/powe
自动测试工具 这里列出一些能满足不同需求的测试工具供你选择。本小节只是简单介绍个大概,并不提供详细操作指南。 AuToTest AuToTest 是一个全自动测试框架,存在的主要目的就是测试 Linux 内核,当然也可以用来测试其他东西,比如测试一块新硬件是否能稳定工作。AuToTest 是开源软件,以 GPL 方式授权,运行于 server-client 架构(即 C/S 架构)。你可以通过配置 server 端来对运行了 client 端的系统执行初始化、运行与监测工作,也可以自己在目标系统上让 client 运行起来。另外你可以为这个测试框架添加测试用例,详情请参考AuToTe
基本测试 安装好内核后,试试能不能启动它。能启动的话,检查 dmesg 看看有没有隐藏的错误。试试下面的功能: 网络(Wifi 或者网线)是否可用? ssh 是否可用? 使用 ssh 远程传输文件。 使用 git clone 和 git pull 命令。 用用网络浏览器。 查看 email。 使用 ftp, wget 等软件下载文件。 播放音频视频文件。 连上 USB 鼠标等设备。 检查内核日志 使用 dmesg 查看隐藏的问题,对于定位新代码带来的 bug 是一个好方法。一般来说,dmesg 不会输出新的 crit, alert, emerg 级别的错误信息,也不应该出现新的 err 级别的信息。你要注意的
编译安装稳定版内核 如果你用 git 下载源码,就执行以下命令: cd linux-stable git checkout linux-3.x.y 如果是直接下载压缩文件,用以下命令进入源码目录: cd linux-3.x.y 如果你想把内核安装到自己的系统上,最安全的方法是使用你安装好的发行版拥有的配置文件。你可以在 /boot 目录找到当前发行版的内核配置文件: cp /boot/config-3.x.y-z-generic .config 运行下面的命令,可以在当前内核配置的基础上修改一些小地方,然后产生新的内核配置文件。比如说新的内核比你的 Ubuntu 发行版自带的内核多了些新功能,而你正好需要用到
Linux 内核测试哲学 不管是开源还是闭源,所有软件的开发流程中,测试是一个重要的、不可或缺的环节,Linux 内核也不例外。开发人员自测、系统测试、回归测试、压力测试,都有各自不同的目的,但是从更高一个层次上看,这些测试的最终目的又是一样的:保证软件能一直运行下去,当有新功能加进去时,要保证新功能可以正常工作。 在软件释出 release 版之前,不用回归测试就能保证稳定性,并且尽量避免在软件发布后被用户发现 bug。调试被用户发现的 bug 是一项非常浪费时间和精力的工作。因此测试是一项非常重要的工作。不像闭源和专有的操