1. 查看内存分布 (gdb) info proc mappings

2. 对于类的调试,先通过行号来设断点, 比如:(gdb) b TcpConnection.cc:63

3. 打印数组的内容 (gdb) p *array@len

4. 查看全局变量的地址,比如info line <variable>

5. 使用十六进制逐个打印内存 x/10xb <address>,其中第二个x是16进制,b是字节

6. 通过指针打印对象 p *(<class> *)<address>

7. 使用up和down切换堆栈,查看堆栈内的locals,如p <variable>

7. 举例如何看汇编和寄存器,下面r开头的寄存器表示64位寄存器

这是一个string的compare函数

(gdb) disassemble 0x00007fb12eeff2ac <- 根据指令地址获得汇编代码
   0x00007fb12eeff2a0 <+0>:     push   %rbp
   0x00007fb12eeff2a1 <+1>:     push   %rbx
   0x00007fb12eeff2a2 <+2>:     sub    $0x8,%rsp
   0x00007fb12eeff2a6 <+6>:     mov    (%rdi),%rdi        <- 第一个参数是this指针,取得的是string的M_data
   0x00007fb12eeff2a9 <+9>:     mov    (%rsi),%rsi         <- 第二个参数是对比的字符串,取得的是string的M_data
=> 0x00007fb12eeff2ac <+12>:    mov    -0x18(%rdi),%rbp <- 取第一个字符串的size, 地址是偏移24Bytes,第三个整型
   0x00007fb12eeff2b0 <+16>:    mov    -0x18(%rsi),%rbx
   0x00007fb12eeff2b4 <+20>:    mov    %rbp,%rdx      <- 以下三句是取%rbp 和 %rbx的min值,最终min的结果存在%rdx
   0x00007fb12eeff2b7 <+23>:    cmp    %rbp,%rbx             
   0x00007fb12eeff2ba <+26>:    cmovbe %rbx,%rdx
   0x00007fb12eeff2be <+30>:    callq  0x7fb12ee9ec70 <memcmp@plt>  <- %rdi, %rsi, %rdx 构成了memcmp的三个参数
   0x00007fb12eeff2c3 <+35>:    test   %eax,%eax

std::string::compare代码如下

int
      compare(const basic_string& __str) const
      {
    const size_type __size = this->size();
    const size_type __osize = __str.size();
    const size_type __len = std::min(__size, __osize);

int __r = traits_type::compare(_M_data(), __str.data(), __len);
    if (!__r)
      __r = _S_compare(__size, __osize);
    return __r;
      }

通过info registers可以获得上述的%rdi, %rsi, %rdx寄存器的值

通过x/147cb打印147Byte的字符串

通过x/1xg打印一个64位的整型

GDB调试技巧的更多相关文章

  1. GDB调试技巧:总结篇

    目录 一 写在开头 1.1 本文内容 二 学习资料 三 常用命令 四 调试技巧 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 写在开头 1.1 本文内容 总结GDB调试的一些常用命令和调试 ...

  2. pwn 题GDB调试技巧和exp模板

    GDB分析ELF文件常用的调试技巧 gdb常用命令 首先是gbd+文件名 静态调试 ,gdb attach +文件名 动态调试 为了方便查看堆栈和寄存器 最好是安装peda插件 安装 可以通过pip直 ...

  3. gdb调试技巧 找到php执行进程当前执行的代码

    假设线上有一段php脚本,突然在某天出问题了,不处理但是进程没有退出.这种情况可能是异常休眠或者是有段死循环代码,但是我们怎么定位呢,我们这个时候最想知道的应该是这个脚本在此刻在做什么吧.这个是gdb ...

  4. 100个gdb调试技巧

    找到的一个有参考价值的关于GDB调试的站点:https://gitlore.com/subject/15

  5. GDB 调试技巧(不断更新中......)

    一.break到不同类的同名函数 方法: 在函数前面加类名以及作用域运算符 eg : break A::func //break 到类A的func函数 程序如下: //gdb_test.cpp #in ...

  6. Linux基础 30分钟GDB调试快速突破

    引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代 ...

  7. GDB调试基础

    GDB调试基础 https://lesca.me/archives/gdb-basic-knowledge.html GDB笔记(二):条件断点.命令列表.监视点 https://lesca.me/a ...

  8. GDB调试命令手册

    使用GDB 启动 $ gdb program           # program是你的可执行文件,一般在当前目录 $ gdb program core      # gdb同时调试运行程序和cor ...

  9. 【转贴】gdb中的信号(signal)相关调试技巧

    一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧 转自Magic C++论坛  http://www.magicunix.com/index_ch.html  http://www.m ...

随机推荐

  1. PAT - 基础 - 最大公约数和最小公倍数

    题目: 本题要求两个给定正整数的最大公约数和最小公倍数. 输入格式: 输入在一行中给出2个正整数M和N(<=1000). 输出格式: 在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1 ...

  2. asp.net在应用母版的页面下采用了ModalPopupExtender弹出窗中应用autocomplete

    autocomplete是jqueryUI的一个插件,可以实现自动填充的功能. 要点:1.应用了母版页,所以取页面上控件的ID时与一般方法不同 2.由于用了ajax的updatepanel,所以会出现 ...

  3. ThinkPHP 自动验证与自动填充无效可能的原因

    原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇 ...

  4. Ubuntu使用Xming和Putty

    运行个复杂的,比如 gnome-session,这个是 GNOME 的启动命令,如果想打开 KDE 就是 startkde root@carlo-cloud:~# xlogoThe program ' ...

  5. Django socketio 安装

    如果你还没有安装过 gevent,首先需要安装 libevent, 编译安装 libevent 需要安装 Pyhton 开发库. 在Debain上可以运行如下指令: $ sudo apt-get in ...

  6. 修改app名字

    一张图说明问题 如果没有成功clean一下,或者卸载掉原有的重新生成一下 如果要修改路径名和工程名有个复杂的方法 http://blog.sina.com.cn/s/blog_a42013280101 ...

  7. X-Plosives

    uvaLive 3644:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&pa ...

  8. Dollars

    uva147: 题意:给你几种钱币,在给你一个钱的数目,问有多少种用这些钱来组成这个数目. 题解:完全背包,不过此时要把钱的数目*100,因为是小数,背包的容量都是整数,然后dp,求出每个容量的数目即 ...

  9. codeforces C. Devu and Partitioning of the Array

    题意:给你n个数,然后分成k部分,每一个部分的和为偶数的有p个,奇数的有k-p个,如果可以划分,输出其中的一种,不可以输出NO; 思路:先输出k-p-1个奇数,再输出p-1个偶数,剩余的在进行构造.  ...

  10. 智能硬件开发如何选择低功耗MCU

    本文将市场上典型的低功耗MCU系列进行了比较,分析得出基于ARM. Cortex M0+内核的MCU系列最适合穿戴式医疗设备的开发.设备开发者当密切关注其发展动向,结合现有的市场需求.产品体系的构建和 ...