ubuntu gdb 调试 ubuntu下用什么软件写代码
大家好,今天小编来为大家解答以下的问题,关于ubuntu gdb 调试,ubuntu下用什么软件写代码这个很多人还不知道,现在让我们一起来看看吧!
盘点Linux内核debug绝招之一:GDB调试器
本文是"降龙十八掌"系列的第一招——GNU DeBuger(GDB)调试器,适用于Linux系统,以Ubuntu 18.04和gdb v8.1.1为例。本文将深入探讨GDB的底层原理和在Linux内核调试中的应用。
首先,GDB底层实现始于gdbserver的main函数,该函数实际上通过captured_main函数完成初始化,包括解析用户指令、初始化核心服务并启动事件循环。核心服务初始化时,会通过ptrace和调试core文件,确保功能可用。例如,创建子进程,设置追踪状态,以及插入断点等操作都在这个过程中完成。
插入断点的实现涉及gdb的breakpoint.c和infrun.c,通过initialize_breakpoint_ops创建断点,然后调用相应函数,如insert_memory_breakpoint,将断点指令插入目标地址。
此外,文章还分享了如何利用GDB调试实际的内核代码,如在qemu中的arm64 Linux,通过交叉编译和gdb-server实现远程调试。通过模拟异常,如动态加载模块时的越界错误,展示了如何通过GDB一步步追踪到问题所在。
深入学习GDB,可参考官方文档,如sourceware.org/gdb/current/和sourceware.org/gdb/wiki/,以及一些实用的命令集合。最后,文章推荐了其他与Linux内核编程相关的技术资源,供读者进一步探索。
ubuntu18.04环境下编译支持debuginfod的gdb
在Ubuntu旧版发行版(低于18.04)中,debuginfod和gdb的支持存在一些挑战。debuginfod自Ubuntu 22.10开始默认安装,而在更早版本中,需要手动配置。gdb从10.1版本开始支持debuginfod,而Ubuntu中较旧的gdb版本通常低于10.1,这就要求升级。
首先,需要确保安装了elfutils的高版本,因为debuginfod包含在其中,从elfutils-0.178开始支持。由于旧版Ubuntu的elfutils版本较低,可能需要源码编译安装。安装时,可能会遇到缺少libmicrohttpd、libcurl、sqlite3和libarchive等依赖库的问题,可以使用apt安装相关dev包。
接着,编译安装gdb-13.1,尽管已安装debuginfod,但gdb在编译时仍会报错。这是因为gdb依赖于libdebuginfod,而pkg-config工具在找不到对应的libdebuginfod.pc配置文件时会认为缺少该库。可以通过检查gdb的configure命令手动定位问题,并将libdebuginfod.pc路径添加到环境变量PKG_CONFIG_LIBDIR中。
配置debuginfod服务器地址为debuginfod.ubuntu.com,将其添加到bashrc文件中。当使用gdb调试时,会通过http协议从服务器获取程序的调试符号和源文件。
gdb-13.1中的debuginfod命令允许查看和设置服务器地址等配置。使用这些命令可以调整debuginfod的功能,以充分利用其远程符号文件支持。
对于Ubuntu 22.xx版本,可以通过apt直接安装debuginfod,然后配置服务器地址。而在Ubuntu 23.xx的最新版本中,gdb默认版本为13.1,已经包含了对debuginfod的支持,无需额外配置即可使用。
总之,要在旧版Ubuntu上编译并使用支持debuginfod的gdb,需要升级相关库,配置服务器地址,并正确设置gdb的debuginfod配置。新版本的Ubuntu则提供了更方便的安装方式。
Ubuntu系统生成dump文件,然后用gdb来调试
为使Ubuntu系统生成dump文件并使用gdb调试,需按步骤进行设置。首先,通过执行"ulimit-c"查看当前是否启用生成dump文件功能。如结果为0,则意味着未启用,应执行"ulimit-c unlimited"以允许生成dump文件。再次执行"ulimit-c"确认设置已更改为unlimited。
其次,需设定dump文件的保存路径。使用"cat/proc/sys/kernel/core_pattern"查看当前路径,通常该路径会将dump文件传递给某个守护进程处理,导致无法直接查看文件。通过命令"echo"/corefile/core-%e-%p-%t"| sudo dd of=/proc/sys/kernel/core_pattern"将路径修改为“/corefile/core-%e-%p-%t”。此处的"%e-%p-%t"分别代表执行文件名称、进程id和当前时间,路径“/corefile”可根据个人需求自定义。再次使用"cat/proc/sys/kernel/core_pattern"验证设置是否正确。
完成上述设置后,启动程序并引发崩溃。崩溃后,dump文件将在指定目录下生成。随后,使用gdb进行调试,通过命令"gdb./应用程序 core.xxxx"恢复程序崩溃时刻的状态。
在gdb界面中,输入"bt"命令列出崩溃时的堆栈信息,通过编号如#0、#1等定位具体栈帧。若需深入了解特定栈帧,执行"(gdb) f N"切换至该栈帧,使用"p变量"查看变量值,追踪异常源。通过"info args"显示当前函数参数及其值,"info locals"则展示当前函数中所有局部变量及其值。"info catch"打印当前函数中的异常处理信息,辅助诊断问题。