簡體   English   中英

為 lldb 中的大型數據結構設置觀察點

[英]Setting watchpoints for large data structures in lldb

我正在學習 lldb,我很好奇您如何為較大的數據結構(例如向量)設置觀察點。 我知道我可以使用 print 並且可以使用,但是我收到一條消息,說不支持大小為“x”的觀察點。 有沒有解決的辦法? 謝謝您的幫助!

(lldb) s
Process 36110 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = step in
    frame #0: 0x0000000100001600 a.out`main at test.cpp:10
   7        vector<int> arr;
   8        arr.push_back(1);
   9        arr.push_back(2);
-> 10       arr.push_back(3);
   11       arr.push_back(4);
   12       arr.push_back(5);
   13
Target 0: (a.out) stopped.
(lldb) print arr
(std::__1::vector<int, std::__1::allocator<int> >) $2 = size=2 {
  [0] = 1
  [1] = 2
}
(lldb) w s v arr
error: Watchpoint creation failed (addr=0x7ffeefbff458, size=24, variable expression='arr').
error: watch size of 24 is not supported

如果您使用的是 Mac,x86_64 架構允許 4 個獨立的監視區域,每個區域最多 8 個字節。 目前,lldb 只會使用一個區域,每個 watch 請求。 它可以將多個監視區域組合在一起來處理適用於這種結構的更大的請求。 請隨時向http://bugs.llvm.org提交此功能的增強請求。 但是觀察點確實是有限的資源,因此您通常必須非常有針對性地關注您要觀看的內容 - 這可能就是為什么沒有人開始支持 > 8 字節的原因。

如果您想在元素添加到向量或從向量中刪除時停止,觀察向量中的結束指針(即__end_ )就足夠了。 您可以使用“frame var”的--raw參數查看向量的實際內容:

(lldb) fr v --raw arr
(std::__1::vector<int, std::__1::allocator<int> >) arr = {
  std::__1::__vector_base<int, std::__1::allocator<int> > = {
    __begin_ = 0x0000000100400000
    __end_ = 0x000000010040001c
    __end_cap_ = {
      std::__1::__compressed_pair_elem<int *, 0, false> = {
        __value_ = 0x0000000100400038
      }
    }
  }
}

每當向量增長或縮小時,結束標記都會得到調整,因此觀察點設置為:

(lldb) watch set v arr.__end_
Watchpoint created: Watchpoint 1: addr = 0x7ffeefbff1c8 size = 8 state = enabled type = w
    declare @ '/tmp/vectors.cpp:6'
    watchpoint spec = 'arr.__end_'
    new value: 0x000000010030020c

將捕獲 push_back、erase 等。

如果你想在向量值改變時停止,你將不得不觀察單個值; 如果只有 32 個字節可以播放,您將不會在有意義的大小向量中觀看所有數據。 當然,當向量調整大小時,您對舊數據的觀察點現在將指向已釋放的內存......

暫無
暫無

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

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