gdb查看内存地址和栈中的值—查看虚函数表、函数地址

http://blog.sina.com.cn/s/blog_605f5b4f0101ey1q.html

 gdb查看指定地址的内存地址的值:examine 简写 x-----使用gdb> help x 来查看使用方式
     x/ (n,f,u为可选参数)
n: 需要显示的内存单元个数,也就是从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义
f:显示格式
               x(hex) 按十六进制格式显示变量。
               d(decimal) 按十进制格式显示变量。
               u(unsigned decimal) 按十进制格式显示无符号整型。
               o(octal) 按八进制格式显示变量。
               t(binary) 按二进制格式显示变量。
               a(address) 按十六进制格式显示变量。
               c(char) 按字符格式显示变量。
               f(float) 按浮点数格式显示变量
u:每个单元的大小,按字节数来计算。默认是4 bytes。GDB会从指定内存地址开始读取指定字节,并把其当作一个值取出来,并使用格式f来显示
               b:1 byte     h:2 bytes     w:4 bytes g:8 bytes
     比如x/3uh 0x54320表示从内存地址0x54320读取内容,h表示以双字节为单位,3表示输出3个单位,u表示按照十六进制显示。
    from http://www.cnblogs.com/super119/archive/2011/03/26/1996125.html



gdb打印表达式的值:print/f 表达式
f是输出的格式,x/d/u/o/t/a/c/f


表达式可以是当前程序的const常量,变量,函数等内容,但是GDB不能使用程序中所定义的宏


查看当前程序栈的内容: x/10x $sp-->打印stack的前10个元素
查看当前程序栈的信息: info frame----list general info about the frame
查看当前程序栈的参数: info args---lists arguments to the function
查看当前程序栈的局部变量: info locals---list variables stored in the frame
查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器)
查看当前栈帧中的异常处理器:info catch(exception handlers)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
http://blog.sina.com.cn/s/blog_87bbe37e01018kio.html

gdb查看虚函数表、函数地址

1. 查看函数地址
    看函数在代码的哪一行,使用info line就可以看到类似下面这中输出

点击(此处)折叠或打开

  1. (gdb) info line a.cpp:10
  2. Line 10 of "a.cpp" starts at address 0x80487d4 <_ZN1B5test2Ev> and ends at 0x80487d7 <_ZN1B5test2Ev+3>.
  3. (gdb) p _ZN1B5test2Ev
  4. $1 = {void (B * const)} 0x80487d4
  5. (gdb)
    可以直接根据函数地址去打断点,当然如果知道文件和行号其实没必要拐个弯来打这种费解的断点,应用场合更多是想使用汇编调试的时候。

点击(此处)折叠或打开

  1. 16 public:
  2. 17 virtual void test2(){
  3. 18 cout << "If I'm lying, I'm crying!" << endl;
  4. 19 }
  5. 20
  6. (gdb) info line 17
  7. Line 17 of "a.cpp" starts at address 0x8048808 <_ZN1D5test2Ev> and ends at 0x804880e <_ZN1D5test2Ev+6>.
  8. (gdb) b *0x804880e
  9. Note: breakpoint 2 also set at pc 0x804880e.
  10. Breakpoint 3 at 0x804880e: file a.cpp, line 18.


2. 查看虚函数表
    如果仅仅是想知道当前对象的真实类别,那使用这句就可以看到了(示例里面的b实际上是D类对象,而非B类)。

点击(此处)折叠或打开

  1. (gdb) set print object on
  2. (gdb) p b
  3. $3 = (D &) @0xbfe3116c: { = {_vptr.B = 0x8048948}, }

    查看对象里面的虚指针,也很简单,把虚指针指向的内容显示一下就可以了。

点击(此处)折叠或打开

  1. (gdb) p b
  2. $6 = (D &) @0xbfe3116c: { = {_vptr.B = 0x8048948}, }
  3. (gdb) p /a *(void**)0x8048948@2
  4. $7 = {0x8048834 <_ZN1D4testEv>, 0x8048808 <_ZN1D5test2Ev>}
    查看虚表的前面,会发现g++实现的时候将RTTI信息放到虚函数表的前面一点点了。反汇编查看代码其实也可以发现的,typeid会根据虚表指针偏移一下去找RTTI信息。

点击(此处)折叠或打开

  1. (gdb) p /a *((void**)0x8048948-1)
  2. $18 = 0x8048950 <_ZTI1D>

点击(此处)折叠或打开

  1. sles10sp1:~/test # c++filt _ZTI1D
  2. typeinfo for D

PS:
    C++的多态是基于虚指针来实现的,如果不小心导致虚指针的值被改写了(最常见的错误就是对一个包含虚指针的对象执行了memset操作),就可能导致程序core掉。
    而调用虚函数、使用dynamic_cast以及typeid都会使用到虚指针,所以当程序core这些需要在呈现多态的地方,不必感到太惊讶。
    另外大多数编译器对虚指针的赋值是在构造函数里面进行的,而这部分赋值代码是编译器自行插入的。



<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(68) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
要使用GDB查看函数调用,你可以按照以下步骤进行操作: 1. 首先,启动GDB并加载你的程序。你可以使用以下命令:`gdb <your_program>`。 2. 在GDB,你可以使用`backtrace`命令或简写的`bt`命令来查看函数调用。这将显示当前函数调用的顺序以及每个函数的输入参数和局部变量。例如,你可以输入`bt`命令来查看函数调用。 3. 如果你想查看更详细的信息,你可以使用`frame`命令或简写的`f`命令,后跟帧号。帧号从0开始,示最新的函数调用。例如,你可以输入`f 0`命令来查看最新的函数调用的详细信息。 4. 如果你想查看特定函数的调用,你可以使用`up`命令或简写的`u`命令来向上移动到上一个函数调用。例如,你可以输入`u`命令来查看上一个函数调用的详细信息。 总结起来,使用GDB查看函数调用的步骤如下: 1. 启动GDB并加载你的程序。 2. 使用`bt`命令查看函数调用。 3. 使用`f`命令和帧号查看特定函数调用的详细信息。 4. 使用`u`命令向上移动到上一个函数调用。 希望这些信息对你有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [GDB使用技巧(3)——查看信息](https://blog.csdn.net/li_wen01/article/details/105223367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用查看](https://blog.csdn.net/qq_37375427/article/details/85226496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [GDB入门教程之查看函数调用堆](https://blog.csdn.net/qq_39107832/article/details/119206954)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值