簡體   English   中英

如何在 lldb 上設置 std::string 類型?

[英]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.

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