gdb檢視虛函式表 函式位址

2022-03-27 11:22:00 字數 1211 閱讀 9422

1. 檢視函式位址

看函式在**的哪一行,使用info line就可以看到類似下面這中輸出

點選(此處)摺疊或開啟

(gdb) info line a.cpp:10

line 10 of "a.cpp" starts at address 0x80487d4 <_zn1b5test2ev> and ends at 0x80487d7 <_zn1b5test2ev+3>.

(gdb) p _zn1b5test2ev

$1 = 0x80487d4

(gdb)

點選(此處)摺疊或開啟

16 public:

17 virtual void test2()

20(gdb) info line 17

line 17 of "a.cpp" starts at address 0x8048808 <_zn1d5test2ev> and ends at 0x804880e <_zn1d5test2ev+6>.

(gdb) b *0x804880e

note: breakpoint 2 also set at pc 0x804880e.

breakpoint 3 at 0x804880e: file a.cpp, line 18.

2. 檢視虛函式表

如果僅僅是想知道當前物件的真實類別,那使用這句就可以看到了(示例裡面的b實際上是d類物件,而非b類)。

點選(此處)摺疊或開啟

(gdb) set print object on

(gdb) p b

$3 = (d &) @0xbfe3116c: , }

檢視物件裡面的虛指標,也很簡單,把虛指標指向的內容顯示一下就可以了。

點選(此處)摺疊或開啟

(gdb) p b

$6 = (d &) @0xbfe3116c: , }

(gdb) p /a *(void**)0x8048948@2

$7 =

檢視虛表的前面,會發現g++實現的時候將rtti資訊放到虛函式表的前面一點點了。反彙編檢視**其實也可以發現的,typeid會根據虛表指標偏移一下去找rtti資訊。

點選(此處)摺疊或開啟

(gdb) p /a *((void**)0x8048948-1)

$18 = 0x8048950 <_zti1d>

點選(此處)摺疊或開啟

sles10sp1:~/test # c++filt _zti

C 虛函式 虛函式表位址

總結自 編譯器 vs2017 一 虛函式 當我們使用基類的引用或者指標呼叫乙個虛成員函式時會執行動態繫結,直到執行時才知道到底呼叫了哪個版本的虛函式,被呼叫的函式是與繫結到指標或者引用上的物件的動態型別相匹配的那乙個。所有虛函式都必須有定義。虛函式的作用主要是實現多型機制。using namespa...

虛函式表存放位址

1.虛函式表是全域性共享的元素 即全域性僅有乙個.2.虛函式表類似乙個陣列 類物件中儲存 vptr指標,指向虛函式表 即虛函式表不是函式 不是程式 不肯能儲存在 段.3.虛函式表儲存虛函式的位址 即虛函式表的元素是指向類成員函式的指標 而類中虛函式的個數在編譯時期可以確定 即虛函式表的大小可以確定 ...

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...