2013-04-16 40 views
12

假設我有一個緩衝buf的C-字符串表示如何讓gdb打印十六進制字符串中的不可打印字符而不是八進制字符,同時保留ascii格式的ascii字符?

char* buf = "Hello World \x1c" 

當我使用命令p buf在gdb打印此BUF,我得到以下

$1 = "Hello World \034" 

是否有一個打印命令或一個gdb設置將會打印下面的內容?

$1 = "Hello World \x1c" 

我曾嘗試過各種格式參數,如/c/x,但他們沒有得到,我尋找的效果。我也玩過printf,但無法達到預期的效果。

更新:我使用的是「GNU gdb(GDB)7.0.1-debian」。

更新: 我也玩過x。

如果我這樣做x/c它打印不可打印字符的八進制和十進制,然後打印ascii和小數的可打印字符。

如果我做x/s它輸出完全相同的p命令。

如果我這樣做x/x它只是輸出十六進制,但然後我們失去了可打印部分的ascii字符。

更新:這個reference,除非不完整,表明我的願望是不可用的,但任何人都可以證實?

回答

2

您可以使用x命令轉儲存儲您的字符串參考點:

(gdb) x/32xb buf 

顯示第一個32個字節。

(gdb) help x 

的細節

+0

請參閱更新問題。 – merlin2011

+0

我正在做一些asm調試,並試圖通過使它們在字符串中並排讀取時很容易地獨立讀取hex和ascii來最大化可讀性。 – merlin2011

-2

可以打印緩衝區使用命令字符串:打印/秒。因此

$ print /s buf 

應該解決您的問題。

+0

似乎沒有工作:-( (gdb)print/s bytes $ 6 =(unsigned char *)0x7ffff7ef3834「\ 334 \ 250 \ 305%1s \ 337 \ 022 \ 335 \ 226R \ 035r \ 022L \ 341 \ 350 \ 315 \ 203CZ \ 021 \ 271 \ 316 \ 360 \ 366 \ 324z \ 271 \ 027 \ 374 \ 251 \ 276KB \ 321 \ 060 \ 203} PW \ 213 \ 030S \ 204 \ 261 | \ 227 | \ 343 \ fl \ 371 \ 003P \ 020 \ 223 \ 307v \ r \ 233 \ 020 \ 225 \ 225#\ 252 \ 231 \ 261 \ 273 \\「 – Zardus

相關問題