[英]How set std::string type on lldb?
我有以下代碼:
#include <iostream>
#include <string>
int main() {
std::string name = "Foo";
return 0;
}
當我使用lldb
調試時,我想設置一個std::string
就像我設置這個int
:
expr int $num = 4
我嘗試:
expr std::string $name = "Foo"
我得到了:
error: no type named 'string' in namespace 'std'
有誰明白發生了什么? 如何在lldb
上創建std::string
?
觀察:
當我打印name
,lldb 為std::string
給我這種類型的std::__1::string
std::string
:
p foo
(std::__1::string) $2 = "foo"
std::string 從外面看起來很簡單,但它實際上是一個相當復雜的小野獸......
例如,除復制構造函數之外的所有 std::string 構造函數都采用大多數普通 C++ 用戶從未覆蓋的默認參數(分配器等),因此不知道。 由於我們是從 DWARF 調試信息中獲取有關類型的信息,因此我們受到它所代表的內容的限制。 然而,它不代表默認參數的值,所以我們不知道如何填寫它們。
您可以通過閱讀字符串標頭更努力地嘗試,並且您發現您需要提供大小和分配器,並獲得如下內容:
expr std::string $myStr("Foo", 4, std::allocator<char>())
error: Couldn't lookup symbols:
__ZNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEC1EPKcmRKS4_
那失敗了,因為分配器到處都是內聯的,所以 lldb 找不到調用它的構造函數。
真正的解決方案是讓 lldb 從頭文件重建 std 模塊,將生成的 clang 模塊導入 lldb 的編譯器並使用它來創建這些值。 那時,我們將擁有完成這項工作所需的信息。 例如,我們會知道默認參數,並且可以從模塊中實例化丟失的分配器。
但是從 c++ 標准頭文件構建一個 Clang 模塊結果證明並不是完全微不足道的,所以我們仍在努力......
您可以選擇使用:
expr const char * $foo
expr const char $foo[]
expr const char $foo[4]
顯然只有在知道字符數組的維數時才能使用最后一個
您使用的是哪種編譯器? 從我發現這個問題存在於 clang 5.0.1 但不存在於 clang 7.0.0。 這可能是與地址清理程序相關的問題。
嘗試brew install llvm --with-toolchain --with-lldb
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.