簡體   English   中英

用ptype顯示GDB中的所有C ++數據字段(甚至繼承)

[英]displaying with ptype all C++ data fields (even inherited) in GDB

在C ++ 11程序中(在Linux / Debian / x86-64上與GCC 5一起編譯 ,帶有g++ -Og -g3 -Wall -std=c++11 b.cc -o bprog ),當您具有類層次結構時例如在此文件b.cc

  #include <string>
  #include <vector>
  class A {
    int a1i;
    double a2d;
  public:
    A(int x, double y) : a1i(x), a2d(y) {};
    ~A() = default;
  };

  class B : public A {
    std::string b1s;
    int b2ii[2];
    std::vector<long> b3vl;
  public:
    B (int x, double y, const char*s, int a, int b)
      : A(x,y), b1s(s), b2ii{a,b},
        b3vl{x,a,b,x+a,a*b} {};
    ~B() = default;
  };

  int main(int argc, char**argv) {
    B bobj {1,2.1,"bname",3,4};
    return 0;
  }      

並使用最新的GDB (即7.10),我想顯示該類型的所有數據字段(如果有的話甚至是vtable指針)。 使用ptype命令不是很有幫助(因為不會顯示繼承的字段):

 (gdb) ptype B
  type = class B : public A {
    private:
      std::__cxx11::string b1s;
      int b2ii[2];
      std::vector<long, std::allocator<long> > b3vl;

    public:
      B(int, double, const char *, int, int);
      ~B(int);
  }      

大部分動機是我正在與GCCJIT (或也許是其他一些JIT庫,但可能還有GCCJIT)進行交互,當然,JITing代碼需要了解實現細節,例如每個數據字段的類型和偏移量。 如果您對更多細節感興趣,請參閱此線程

例如,JIT-er應該內聯到bobj.b3vl[i]的讀取訪問權限,因此我需要了解機器布局...

我知道C ++標准容器和字符串中的字段是特定於實現的(但我確實知道它們在實際中相差不大,但變化不大)

您是否有任何技巧或竅門可以通過GDB輕松獲取所有(字段名稱,類型和偏移量)信息(包括繼承字段的信息)?

我認為沒有gdb內置的方法可以做到這一點。 請參閱此gdb功能請求

但是,可以使用Python相對輕松地完成此操作。 如果您擁有pahole gdb命令(不是上游gdb的一部分,但至少是在Fedora中提供的),那么就可以解決問題(盡管現在看起來似乎確實很丑陋)。 至少將顯示如何編寫代碼。

暫無
暫無

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

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