番外

  2019年7月26日至27日,公司邀请《软件调试》和《格蠹汇编——软件调试案例集锦》两本书的作者张银奎老师进行《Linux高级调试与优化》培训,有幸聆听张老师的课程。若干年前有幸拜读过《软件调试》一书,受益匪浅。

  张老师给人的感觉温文尔雅,谦谦如玉,对Windows和Linux内核的内存分配和任务管理机制有非常深入的了解,对Intel CPU的内部实现机制也有很深的功底,如数据/代码缓存、数据/代码TLB缓存、乱序执行、MMU机制等。

  整个培训的内容包括:

1)Linux gdb调试命令

2)Linux信号量机制和应用程序崩溃

3)用户态进程coredump转储和分析

4)用户态堆

5)Linux内存管理

6)Linux任务管理

7)使用kdb/kgdb调试Linux内核

8)oops和panic

Linux gdb命令

1、跟踪调试类

file <可执行文件> 加载可执行文件

break <func>|<file:line> 设置代码段断点,如果设置的函数所在的库还没有加载到进程地址空间,也可以设置断点,这个时候它是一个悬而未决的断点(pending状态),因为不确定其具体地址是多少,但是进程继续运行加载了库文件后,其地址就确定下来了

break [file:line] if cond 如果cond满足条件则在指定处断点

info breakpoints 查看断点

enable <break number> 使能断点

disable <break number> 禁用断点

delete <break number> 删除断点

watch <addr/variable> 设置数据段断点(也称内存断点或者硬件断点,Intel CPU最多支持同时设置4个数据断点)

awatch 设置数据写操作断点

rwatch 设置数据读操作断点

info watchpoints 查看观察点

backtrace 显示函数调用栈,如果出现符号表无法显示,而是显示??,则表示编译器没有为该段代码分配符号表,即一段匿名代码,比如汇编代码或者一次性执行的代码

where 与backtrace相同

run 从程序入口开始执行

continue 继续运行,直到下一个断点或者程序结束

next 执行下一行代码,如果代码行为子函数调用,不进入子函数内部,当做一条代码行执行

step 单步调试,执行下一行代码,如果代码行为子函数调用,进入子函数内部逐条执行

ni 执行下一条指令

si 单步调试,执行下一条指令

finish 运行直到当前函数执行完

frame <n> 选择第n层调用栈帧

up 选择上一层调用栈帧

down 选择下一层调用栈帧

info threads 查看所有线程

thread [thread number] 跳转到指定的线程

thread apply all <command> 针对所有线程执行指定命令

thread apply all bt 显示所有线程的调用栈

2、info类(观察调试相关信息)

info breakpoints 显示break断点

info watchpoints 显示watch观察点

info files 显示elf文件信息

info sharedlibrary 显示共享库地址映射

info registers 显示CPU通用寄存器值

info all-registers 显示所有CPU寄存器值

info args 显示函数参数

info var [regex] 显示全局变量或者名字包含regex字符串的全局变量

info locals显示局部变量

info func [regex] 查找调用regex函数的函数

info address s 显示符号s的地址

info signals 显示信号量

info stack 显示函数调用栈,作用同bt命令

info frame [n] 显示指令调用栈帧

info display 显示显示配置

info line num 显示代码行

info source 显示代码文件名

info sources 显示正在使用的代码列表

info threads 显示所有线程

3、show命令观察gdb本身的信息

4、x直接观察内存

x/128wx $sp

x/128wi $pc

例如:

(gdb) x/64wx $sp
0xe342c548: 0x00000000 0xe342cb40 0x00000000 0x00000000
0xe342c558: 0x06f74f8f 0x0c6a543b 0xe342cb40 0xfff333f4
0xe342c568: 0x00000000 0x00000152 0x00000000 0xfff333f4
0xe342c578: 0x00000000 0xe342c67c 0x00000000 0x00000000
0xe342c588: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c598: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5a8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5b8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5c8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5d8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5e8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c5f8: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c608: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c618: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c628: 0x00000000 0x00000000 0x00000000 0x00000000
0xe342c638: 0x00000000 0x00000000 0x00000000 0x00000000

5、list命令

显示当前执行命令前后的代码

disp /3i $pc 每次单步执行都显示接下来要执行三条指令

6、print命令

p [/f] expr - print命令后通常接C语言表达式,返回表达式结果

ptype [expr]/[type] 打印结构体

p addr@[num] 表示打印从addr地址开始的num个字节

7、disassemble 反汇编

set disassemble-flavor [att|intel] 设置汇编指令格式

Linux gdb模式使用AT&T汇编格式,通过set disassemble-flavor intel可以修改汇编格式

8、gdb中执行shell命令

使用shell <cmd>或者!<cmd>格式即可

9、gdb配置命令

set solib-absolute-prefix 设置应用程序加载库的前缀
set solib-search-path 设置应用程序加载库的绝对路径

ptrace(process trace)

GDB实现机制

gdb、glibc和linux都是属于GNU框架之下,gdb和strace命令一样,都是基于linux内核提供的ptrace系统调用实现的。

ptrace(process trace)系统调用允许父进程监视或者操控子进程的内部执行状态,修改子线程的内存和寄存器,因此它通常被gdb或者strace这类跟踪调试或者代码分析的工具使用。

gdb设置断点的原理是插桩,一段代码执行到桩处,则触发SIGTRAP(Trace/breakpoint trap)信号量。

参考文档

1、Debugging with gdb

1、gdb quick reference

Linux高级调试与优化——gdb调试命令的更多相关文章

  1. Linux gcc/g++下GDB调试及其调试脚本的使用

    GDB调试及其调试脚本的使用返回脚本百事通一.GDB调试 1.1. GDB 概述 GDB 是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB ...

  2. Linux下编译ffmpeg并用GDB调试

    1.在Ubuntu界面上调处命令行界面,最方便的方式是使用快捷键Ctrl+Alt+T. 2.安装SDL SDL是一个开源的多媒体开发库,可以设置图像和视频的绘制等操作.如果不安装SDL,FFMPEG将 ...

  3. 对linux高级用户有用的20个命令

    41.命令:ifconfig ifconfig命令用于配置网络接口信息.如配置网络接口的ip地址,默认网关地址等,以便机器能够联通互联网. 显示当前网络接口信息 viidiot@ubuntu:~$ i ...

  4. 使用Qt Creator作为Linux IDE,代替Vim:实现两台Linux电脑远程部署和gdb调试(一台电脑有桌面系统,一台电脑无桌面系统)

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/libaineu2004/article/details/62423830 尊重作者,支持原创,如 ...

  5. Linux下Eclipse里用gdb调试JNI里C/C++

    1,给Eclipse安装CDT插件 2,先以Debug方式运行java程序,停在java代码的断点上 3,Debug Configuration里选择C/C++ Attach to Applicati ...

  6. linux系统基础的优化以及常用命令

    编辑网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改配置参数 ONBOOT= yes启动或者关闭ipsystemctl restart/s ...

  7. 一文入门Linux下gdb调试(一)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE ...

  8. 一文入门Linux下gdb调试(二)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...

  9. gdb调试线程

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

随机推荐

  1. sql server 对数运算函数log(x)和log10(x)

    --LOG(x)返回x的自然对数,x相对于基数e的对数 --LOG10(x)返回x的基数为10的对数 示例:select LOG(3),LOG(6),LOG10(1),LOG10(100),LOG10 ...

  2. 断言(assert)

    断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言. 简单点说,断言指的就是,将结果判断说 ...

  3. 企业面试题|最常问的MySQL面试题集合(二)

    MySQL的关联查询语句 六种关联查询 交叉连接(CROSS JOIN) 内连接(INNER JOIN) 外连接(LEFT JOIN/RIGHT JOIN) 联合查询(UNION与UNION ALL) ...

  4. 在springboot中使用拦截器

    在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想 ...

  5. element-ui 中 switch 开关绑定number 的解决方法

    虽然element-ui 的文档中说明 v-model的值可以是 boolean / string / number 三种类型 , (文档在此)https://element.eleme.cn/#/z ...

  6. Laravel - 验证码(captcha)

    首先,登录网址 packagist.org 查找 laravel captcha,找到mews/captcha ,根据 packagist 上的使用方法一步步来实现验证码的安装.配置composer. ...

  7. C语言:标准IO_fopen( )、fclose() ①

    思前想后一个月,我终于敲下了我的第一篇开山之作. 博客千千万,我的博客首先记录的是学习时候的理解,用于给自己翻阅查找,现在主要研究的是C语言和STM32.如果能帮到你,那是最好的,假如我写的东西有错误 ...

  8. VS插件CodeRush for Visual Studio发布v19.1.5|新的Inline Lambda重构

    CodeRush是一个强大的Visual Studio .NET 插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验.CodeRush能帮助你以极高的效率创建和维护源代码.Consume- ...

  9. 知名界面类控件Kendo UI for jQuery R2 2019 SP1发布|附下载

    Kendo UI for jQuery提供了在短时间内构建现在Web应用程序所需要的一切.从70多个UI中选择,并轻松地将它们组合起来,创建出酷炫响应式的应用程序,同时将开发时间加快了50%. [适用 ...

  10. 移动端 使用 vConsole调试

    前言 用vue 写移动端代码,有个报名页面 就在iOS 9下出现问题,vue的循环渲染都正常,一开始的数据也能取到.证明不是vue的兼容性问题 但是在用户点击按钮发现不能点击进入跳转 工具 推荐使用  ...