2011-08-05 23 views
2

這可能嗎?.gdbinit中的可變別名?

爲了一個具體的例子,考慮下面的宏:

define pos 
po ([self $arg0]) 
end 

所以,現在,如果我輸入POS文本,它就會變成PO [自文本。但有多個參數,它會失敗,例如pos textLabel文本變成了po [self textLabel]而不是所需的po [[self textLabel]文本]。

另一個例子,就像三個命令

po someIvar_ 
po [self someMethod] 
po [[self someMethod]someOtherMethod] 

打印出所引用的三個對象的描述,這將是巨大的,定義一個宏PI這確實爲整數同樣的事情,即

pi [self someMethod] 

是與調用

print (int)[self someMethod], 

並且類似地爲

pi [[self someMethod]someOtherMethod]. 

回答

1

用戶定義的命令只是比字符串替換之前多執行一次而已。您的示例pos textLabel text將兩個參數傳遞給僅考慮一個參數的命令。第二個被扔掉。它應該在執行前導致po [self textLabel]。你要做的就是媲美於Java和的功能:
int sum(int[] args){return args.get(0);}

你需要的是某事mentioned here

define pos 
    if $argc == 1 
     po [self $arg0] 
    end 
    if $argc == 2 
     po [[self $arg0] $arg1] 
    end 
    ..... (as many you need) 
end 

我還沒有發現任何一種循環的。所以這應該是唯一的方法來做到這一點,除了可以從參數中彈出arg0並允許遞歸調用用戶定義的命令。但我認爲它更容易完成上面的例子。

pi應實行同樣的方式

define pi 
    if $argc == 1 
     print (int)[self $arg0] 
    end 
    if $argc == 2 
     print (int)[[self $arg0] $arg1] 
    end 
    .... 
end 

也許有更好的解決辦法,但這個給你帶來了一步走向目的地。

+0

這個答案似乎基本上是正確的,儘管pi的回答與我提出的問題略有不同。 –

+0

啊,我剛剛找到一個有用的鏈接,其中還包括一個while循環以及如何通過動態索引訪問argv。這會幫助你。我目前正在趕時間。我希望我今天晚上有時間(cest)。鏈接:http://www.isi。edu/nsnam/ns/ns-debugging.html – thomas

+0

不,我還沒找到執行gdb-string的解決方案。然後,我將能夠創建將在gdb中執行的打印字符串。但你可以使用while循環(鏈接的示例代碼在argc和argv之前忘記寫入$)。爲了獲得整個層次結構,可以用'> ='替換我的示例代碼中的'=='。並感謝賞金:) – thomas

0

如果你要使用 PO PI 命令在終端看到一個對象的值或者你想在運行時改變所以這裏的值是解決方案:

現在,這裏是最好的解決辦法以調試和分析XCode 4中的客觀c代碼。如果您想在運行時更改變量的值,只需點擊「運行>顯示>表達式... ,然後您就可以爲您提供值可變名稱

但我懷疑你的問題不是Objective-C問題,但我仍然盡力提供解決方案。