簡體   English   中英

在GDB中處理以$開頭的C ++成員變量

[英]Manipulating C++ member variables that begin with $ in GDB

我正在使用具有非常特殊編碼風格的C ++代碼庫,包括使用'$'在類中添加成員變量。 對於之前從未遇到過這種情況的人來說,它不是C ++標准的正式部分,而是潛伏在后向兼容性方面

作為我正在談論的一個例子:

#include <iostream>

class T { public: int $x; int y; };

int main()
{
  T *t = new T();
  t->$x = t->y = 42;
  std::cout << "t->$x = " << t->$x << std::endl;
  delete t;
  return 0;
}

這在GDB中引入了一個問題。 GDB通常使用$前綴變量作為魔術便利變量(例如引用以前的值)。 啟動GDB,在cout語句中設置斷點,並嘗試打印t->$x

pt運行正常。 p *t運行良好。 p t->y運行正常。 p t->$x返回語法錯誤,大概是期望$引用一個便利變量。

理想情況下,我會完全剝離$ s並花費剩余的時間來追捕那些認為這是個好主意的人(特別是對於現代代碼庫)。 這是不現實的,但我仍然需要能夠使用GDB進行調試。

我希望有一個神奇的逃脫角色,但我搜索或試過的任何東西都沒有用。

例子:

  • p this->'\\044descriptor'
  • p this->'$descriptor'
  • p this->'$'descriptor
  • p this->\\$descriptor
  • p this->\\\\$descriptor
  • p this->'\\$descriptor'
  • p this->'\\\\044descriptor'
  • p this->$$descriptor
  • p this->'$$descriptor'

等等。

在這種特殊情況下,我可以運行getter函數( p this->getDescriptor() )。 一個更丑陋的解決方法是打印整個類內容( p *this )。 我不確定我能無限期地依賴這兩者; 一些類相當大,大多數成員變量沒有getter。

這可能被歸類為GDB中的一個錯誤,具體取決於為了支持這一點而撕掉輸入是否是個好主意。 但是,即使它已經修復,我仍然堅持使用GDB 7.2來實現給定的體系結構/構建環境。

有任何想法嗎?

更新: python import gdb; print (gdb.parse_and_eval("t")['$x']) python import gdb; print (gdb.parse_and_eval("t")['$x'])如評論中所建議的那樣,如果你有python builtin(遺憾的是我沒有)。

如果你有gthon版本的python擴展,也許“探索”功能將有所幫助。

請參閱https://sourceware.org/gdb/onlinedocs/gdb/Data.html#Data


  (gdb) explore cs
     The value of `cs' is a struct/class of type `struct ComplexStruct' with
     the following fields:

       ss_p = 
        arr = 

     Enter the field number of choice:

由於您不需要變量名稱,因此您應該可以繞過'$'問題。

暫無
暫無

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

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