簡體   English   中英

為什么GDB找不到一些按名字反匯編的函數?

[英]Why can't GDB find some functions to disassemble by name?

有時我的二進制文件中有一個函數我確定沒有被優化掉,因為它被另一個函數調用:

(gdb) disassemble 'k3::(anonymous namespace)::BM_AwaitLongReadyChain(testing::benchmark::State&)'
Dump of assembler code for function k3::(anonymous namespace)::BM_AwaitLongReadyChain(testing::benchmark::State&):
   [...]
   0x00000000003a416d <+45>:    call   0x3ad0e0 <k3::(anonymous namespace)::RecursivelyAwait<k3::(anonymous namespace)::Immediate17>(unsigned long, k3::(anonymous namespace)::Immediate17&&)>
End of assembler dump.

但是,如果我要求 GDB 使用與它引用的函數相同的名稱來反匯編它,它會聲稱該函數不存在:

(gdb) disassemble 'k3::(anonymous namespace)::RecursivelyAwait<k3::(anonymous namespace)::Immediate17>(unsigned long, k3::(anonymous namespace)::Immediate17&&)'
No symbol "k3::(anonymous namespace)::RecursivelyAwait<k3::(anonymous namespace)::Immediate17>(unsigned long, k3::(anonymous namespace)::Immediate17&&)" in current context.

但是,如果我使用它的地址反匯編它,它工作正常:

(gdb) disassemble 0x3ad0e0
Dump of assembler code for function k3::(anonymous namespace)::RecursivelyAwait<k3::(anonymous namespace)::Immediate17>(unsigned long, k3::(anonymous namespace)::Immediate17&&):
   0x00000000003ad0e0 <+0>:     push   rbp
  [...]
End of assembler dump.

這非常不方便,因為我不知道先驗地址——我必須去反匯編一個調用者才能找到被調用者的地址。 真的很麻煩。

我怎樣才能讓 GDB 按名稱反匯編這個函數? 我認為這是名稱修改/規范化的一些問題,可能與右值引用和/或匿名命名空間有關,但我無法弄清楚到底發生了什么。 我正在使用 GDB 10.0-gg5

但是如果我要求 GDB 使用與它引用的函數相同的名稱來反匯編它,它會聲稱該函數不存在

  1. 有許多可能的修改方案; mangled 和 unmangled 名稱之間的關系不是1:1
  2. GCC 中內置的解析器將foo::bar(int)轉換為可用於在符號表中查找符號的內容可能有錯誤。

這非常不方便,因為我不知道先驗地址——我必須去反匯編一個調用者才能找到被調用者的地址。

如果被調用的函數已經在堆棧上(即活動調用鏈的一部分),您可以通過disas $any_address_in_fn輕松地反匯編它——您不需要給 GDB 提供起始地址。 因此,您可以執行例如第frame 5后跟disas $pc - GDB 將在符號表中找到封閉函數並將其全部反匯編。

另一種選擇是從 file:line info: info line foo.cc:123后跟disas $addr_given_by_previous_command獲取地址。

如果您知道foo::bar()存在於某處,但不知道其源位置,則另一種選擇是通過例如rbreak 'foo::bar'在其上設置斷點。 這將告訴您設置斷點的地址,您可以disassemble該地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM