[英]Why can't gdb evaulate functions when !=/== and &&/|| are combined in an expression?
[英]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:1
。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.