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 _ZTI


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM