前言 我们在调试过程中难免要对照源码进行查看,如果已经开始了调试,而查看源码或者编辑源码却要另外打开一个窗口,那未免显得太麻烦。文本将会介绍如何在GDB调试模式下查看源码或对源码进行编辑。...) 指定源码路径 在查看源码之前,首先要确保我们的程序能够关联到源码,一般来说,我们在自己的机器上加上-g参数编译完之后,使用gdb都能查看到源码,但是如果出现下面的情况呢?...(gdb) 它就会提示找不到源码文件了,那么怎么办呢? 我们可以使用dir命名指定源码路径,例如: (gdb) dir ....调试模式下进行编辑源码了,使用命令edit location,例如: (gdb)edit 3 #编辑第三行 (gdb)edit printNum #编辑printNum函数 (gdb)edit test.c...GDB-TUI 但是本文不作介绍,有兴趣的可以探索一下。 总结 本文介绍了GDB调试中的源码查看,源码编辑以及如何在GDB调试模式下执行shell命令。
首先安装工具gdb,可以 brew install gdb 也可以源码安装 http://ftp.gnu.org/gnu/gdb/ tar -zxvf gdb-8.0.1.tar.gz cd gdb.../gdb/gdb-8.0.1.tar.gz 对mac 10.15.是不ok的,9.2可以编译通过 一段简单的源码开始 package main import "fmt" func main() {...(please check gdb is codesigned - see taskgated(8)) 是权限不够 sudo gdb main 或者给gdb创建证书,具体步骤参考 https://blog.roy4801...gdb /usr/local/bin/gdb cd /usr/local/bin/ vi gdb.xml codesign --entitlements gdb.xml -fs gdb-cert ....) winheight src -5 (gdb) layout split 界面如下 可以同步查看源码和对应的汇编代码
GDB源代码查找路径 在gdb程序的时候,有时候会发现源代码文件找不到 这个时候有两种选择: 1 显示绝对路径并找不到文件 如果gdb这个时候告诉你找不到这个带调试信息库的源文件路径,此时给出的路径地址是绝对路径...,比如 /home/xxx/dev/aaa/bbb/ccc.c: 没有那个文件或目录 这种提示的,你就应该用gdb提供的 set substitute-path 这个其实很好理解,就是替换规则,你如果想查看当前的替换规则...a.cpp 没有那个文件或目录 那么此时你可以用dir dirName来指定,也就是说如果我们此时的a.cpp不在当前目录下,而是在当前目录下的bak文件夹下,我们只要 dir bak 这个时候我们的gdb...注意两者的差别,对于绝对路径来说,你需要给出替换规则给他做字符串替换,对于相对路径来说,你需要给他目录来让他做拼接,也有点prefix的意思,这里的prefix由你给出,但相对路径整体结构由gdb给出,
---- 工具一 GDB MySQL 源代码压缩后都有几百MB ,文件数量又是个天文数字。我们又怎么确认数据库服务端的第一行代码在哪里呢? 这个问题对于 gdb 来讲就是 p !!!...理由有两个 1. gdb 可以根据函数名来设置断点, 2. MySQL 是一个 C++ 程序它的入口函数是 main 。...1.1 用 gdb 拉起 MySQL gdb --args /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my.cnf 1.2...在 main 函数上打上断点,这个时候 gdb 会自动打印 main 函数所在的位置 (gdb) b main Breakpoint 1 at 0x3326cb5: file /data/repos...可以看到 gdb 告诉我们 main 函数在 main.cc 的第 25 行处。
Allocation: 2.000 GiB Physical: 2.000 GiB 显然是有问题的,正常的数值三个应该不通,进入系统查看磁盘使用率也仅有 2% 左右,因此试图通过检查源码的方式查看是否正确...Ssl Aug26 5:22 /usr/sbin/libvirtd --timeout 120 使用 GDB 开始跟踪他: gdb libvirtd 1907 首先在源码中全局搜索 domblkinfo...分析源码找到获取信息的函数 src/libvirt-domain.c -> virDomainGetBlockInfo : if (virDomainGetBlockInfo(dom, device,...,接下来查看源码, entry->wr_highest_offset 的值应该是在这里被赋予的: if (qemuDomainBlocksStatsGather(driver, vm, path, true...最终得到一张 libvirt 查询磁盘使用情况的调用栈示意图: 如果继续探索,可能就需要去跟踪 QEMU 源码了,下篇文章见。
接上文,通过跟踪 libvirt 的源码,找到 virsh domblkinfo 最终是使用 QMP 协议从 QEMU 获取到关键字为 query-block 的数据,其中带有 wr_highest_offset...环境准备# QEMU 4.0 Centos 鲲鹏 ARM 首先需要编译 QEMU 加入函数表,重新编译 QEMU在其中加入该字段即可,编译方法可以参考源码目录: ....开始跟踪: gdb qemu-system-aarch64 2185346 在之前找到的目标函数处打上断点: (gdb) b bdrv_query_bds_stats 之后 c 继续执行,尝试查询一下磁盘状态...->wr_highest_offset $3 = 3072 下面主要就是跟着源码来看了,本文主要是讲了如何使用 GDB 跟踪 QEMU 源码,若有疑问欢迎留言。...参考文献# GDB调试qemu源码纪录 注:本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
gdb使用 这里简单介绍一下gdb的基本使用,更详细的使用方法可以自行google。...启动gdb 捕获进程 gdb -p {pid} run 方法启动 gdb php run test3.php 通过core 文件 gdb -c core.8451 断点 break n :在第n行处设置断点...0x7ffff1793e40] long: 2 } print_ht 输出HashTable, HashTable是php底层一个重要的数据结构是php array的实现方式,你可以理解为是C层面的php array,在php源码中也大量使用...0x7ffff1793e20 [1] a2 => 0x7ffff1793e40 } print_htstr 和 print_ht 类似,只是HashTable中存的不是zval 而是c char,但是这种情况在源码中好像很少见了...(gdb) c Continuing.
apt source libc6-dev 之后目录就出现下面几个东西,glibc-2.24就是源码目录,当然版本有可能不同 glibc-2.24 glibc_2.24-17.debian.tar.xz...glibc_2.24-17.dsc glibc_2.24.orig.tar.xz 0x03 开始调试之旅吧 gdb不会自动找到源码,还需自己干 Breakpoint 1, __GI___libc_free...我们在源码目录找一下 root@kali:~# find ./glibc-2.24/ -name malloc.c ..../glibc-2.24/malloc/malloc.c 最后用directory命令指定一下就好了 gdb-peda$ directory ~/glibc-2.24/malloc/ Source directories...searched: /root/glibc-2.24/malloc:/root/glibc-2.24/malloc/malloc.c:$cdir:$cwd 我们再ni,那就看到执行到源码的那行代码的具体内容了
1 简介 GDB(GNU Debugger)是GCC的调试工具。...3 启动GDB 的方法 gdb program program 也就是你的执行文件,一般在当前目录下。...查看修改变量的值 (gdb) ptype width -- 查看变量width的类型 type = double (gdb) p width -- 打印变量width...的值 $4 = 13 你可以使用set var命令来告诉GDB,width不是你GDB的参数,而是程序的变量名,如: (gdb) set var width...当程序停下来以后, GDB会报告程序停在了那个文件的第几行上。你可以用list命令来打印程序的源代码。默认打印10行,还是来看一看查看源代码的GDB命令吧。
1:gdb打印动态数组: x=(int*)malloc(25*sizeof(int)); p *x@25 或者 p (int [25])*x 完整打印字符串的值: set print elements
本文链接:https://blog.csdn.net/weixin_40313634/article/details/88619906 实验楼值GDB常用命令实战课程学习记录 1....安装工具: sudo apt-get install gdb 2. 编译可调式程序: gcc bugging.c -o bugging -g -m32 -o: 生成的可执行文件的名字。...-g: 生成的程序允许gdb 调试。 -m32:生成32位的程序。默认,程序位数和OS位数相同。 编译32位程序时报错:fatal error: sys/cdefs.h: 没有那个文件或目录。...调试: 开始调试:gdb bugging 结束调试:quit 断点在循环中时: enable once Num // 断点hit 一次后,失效。...打印当前函数的所有局部变量的值: info locals 命令 简写 说明 list l 查看附近源码 next n 执行下一步 step s 一次执行一行,遇到函数会进入 break b 设置断点
理解 自己总结 gdb会记住历史命令,按一次n,回车以后再回车还是n -g才是debug debug才有调试信息,默认的没有 mycode是可执行程序,再gdb这个可执行程序 q退出/quit list
01.gdb使用 程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上...\n"); return 0; } gdb binFile 退出: ctrl + d 或 quit 调试命令: list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。...运行到下一个断点) until X行号:跳至X行 breaktrace(或bt):查看各级函数调用及参数 info(i) locals:查看当前栈帧局部变量的值 quit:退出gdb
GDB官方文档:GDB Documentation 如下图所示: ?...官网提供了PDF、HTML各种版本,如下: Debugging with GDB gdb.pdf.gz 2638 KB gdb.dvi.gz 1033 KB gdb.ps.gz 1499 KB gdb.html.tar.gz
在上一章《在docker上编译openjdk8》里,我们在docker容器内成功编译了openjdk8的源码,有没有读者朋友产生过这个念头:“能不能修改openjdk源码,构建一个与众不同的jdk“,今天我们就来阅读一些...openjdk的源码,再尝试做些小改动并验证。...: gdb --args ..../java -version 效果如下图,可以看到已进入GDB命令行模式,可以继续输入GDB命令了: ?...有了GDB神器,可以愉快的阅读源码了: main.c的main函数中,调用JLI_Launch函数,在Sublime text3中,将鼠标放置在”JLI_Launch”位置,会弹出一个小窗口,上面是JLI_Launch
因为这不是一个典型的通过 java 线程堆栈就可以分析出来的死锁问题,于是写了这篇文章记录了一下,包括下面信息: GDB 在调试 jvm 中使用 如何找到参与死锁的线程 java 线程堆栈 通过 jstack...-XX:-UseCompressedOops -XX:-UseCompressedClassPointers GDB 调试找到死锁的线程 首先 gdb attach 上 jvm 进程,使用 thread...(gdb) frame 8 #8 0x00007ff27808a7e6 in ConstantPool::klass_at_impl (this_oop=..., which=which@entry=...the_thread__=__the_thread__@entry=0x7ff27000e800) at src/hotspot/src/share/vm/oops/constantPool.cpp:252 (gdb...(gdb) p this_oop._value $20 = (Klass *) 0x7ff12eed1de0 接下来我们来搞清楚,到底是哪个线程在初始化这个类。
显示源码: list [list_args]:list(l)显示源代码,list_args类似break中的break_args参数,可以是行号,函数等,详细参考help list。...查找源码: forward-search :regexp是正则表达式,下同,关于正则表达式请参与相关资料。...show directories:显示当前源码搜索路径。...显示源代码虚拟地址: info line [line_args]:显示源码虚拟地址,line_args和前面的list_args类似,详细参考help info line。...问题五:无源码调试 在没有源代码的时候strace就可以发挥神威了,strace会记录程序所产生的每次系统调用,系统调用的名字,参数,返回值会在同一行显示,通过观察返回值的异常对于快速定位问题非常有帮助
gdb调试 能进行GDB调试,一般在编译过程中,需使用-g参数。如果不使用-g参数,则在gdb调试过程中,将不能得到程序的函数名、变量名等信息,而只能看见运行时内存地址。...q:退出gdb调试环境。 help [命令名称]:gdb帮助命令,提供对GDB各种命令的解释说明。...如果指定了“命令名称”参数,则显示该命令的详细说明;若果没有指定参数,则分类显示所有GDB命令,共用户进一步浏览和查询。 cd dir:运行GDB,使用dir作为gdb的工作目录。...l:l相当于list,从第一行开始列出源码。...gdb filename // 其中filename为可执行文件名 gdb filename core // core是程序core dump产生的文件,产生core文件,需设置栈大小无线使用ulimit
GDB高级技巧 yijian 2009-2-22 难得有雅兴,边动手边记录操作步骤,本文主要示例一些平常较少使用到的GDB功能,掌握这些用法有助于提高GDB调试和解决问题的能力。...1) 查看宏 默认情况下,在GDB中是不能查看宏的值及定义的,但通过如下方法,则可以达到目的: 编译源代码时,加上“-g3 -gdwarf-2”选项,请注意不是“-g”,必须为“-g3”,查看宏的值使用命令...使用“rb”命令,如果执行“rb”时不带参数,则表示在所有函数处打一个断点,“rb”后面可以接一个符合正则表达式的参数,用来对符合正则表达式的所有函数打断点 4) .gdbinit文件 GDB在启动时...如果想在命令执行完,再执行某个或某些命令,则: #define hookpost-print echo ----------\n end 7) GDB中循环 GDB支持if/else/while.../loop_break/loop_continue,如: (gdb) set $x=1 (gdb) while $x==1 >p $x >set $x=0 >p $x >end -
gdb的启动 准备内容 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。...gdb program core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。...gdb program 1234 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。...GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb的help查看。 gdb技巧 1. gdb小技巧汇总 gdb技巧挺多的,比如说直接回车是继续执行上一次的代码 巧用tab补全 1....比如输入b连续按下两次tab,可以查看gdb的所有b开头的gdb指令 2.
领取专属 10元无门槛券
手把手带您无忧上云