zoukankan      html  css  js  c++  java
  • GDB调试技巧

    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位的整型

  • 相关阅读:
    hdu 2819 Swap
    匈牙利算法
    hdu 1281 棋盘游戏
    hdu 2444 The Accomodation of Students(最大匹配 + 二分图判断)
    hdu 1045 Fire Net(最小覆盖点+构图(缩点))
    Python实现时钟
    挥之不去的DDOS
    随机数
    wchar_t的用法
    Visual Studio函数被警告安全,如何修改
  • 原文地址:https://www.cnblogs.com/qiangxia/p/4294092.html
Copyright © 2011-2022 走看看