2017-07-01 10 views
4

これは、変数のC同時に2つの異なるフォーマット(10進数と16進数)でメモリアドレスを調べますか?

&
(gdb) info locals 
a = 9 
b = 10 
c = 11 
(gdb) 

メモリアドレスB、C

&
(gdb) print &a 
$1 = (int *) 0x22ff4c 

(gdb) print &b 
$2 = (int *) 0x22ff48 

(gdb) print &c 
$3 = (int *) 0x22ff44 
(gdb) 

Bのメモリアドレス値を調べ、変数の値私のCコード

C:\Codes>gdb var -q 
Reading symbols from C:\Codes\var.exe...done. 
(gdb) list 
1  #include<stdio.h> 
2 
3  int main() 
4  { 
5   int a = 9; 
6   int b = 10; 
7   int c = 11; 
8   return 0; 
9  } 
(gdb) 

です変数a、bの16進数& c

(gdb) x 0x22ff4c 
0x22ff4c:  0x09 
(gdb) 

(gdb) x 0x22ff48 
0x22ff48:  0x0a 
(gdb) 

(gdb) x 0x22ff44 
0x22ff44:  0x0b 
(gdb) 

& C疑問がある

(gdb) x/d 0x22ff4c 
0x22ff4c:  9 

(gdb) x/d 0x22ff48 
0x22ff48:  10 

(gdb) x/d0x22ff44 
0x22ff44:  11 
(gdb) 

B、変数のための小数のメモリアドレス値を調べます。メモリアドレスの値を16進数で印刷することは可能ですか?& 10進数はシングルコマンドで印刷できますか?

このような出力が得られると非常に役に立ちます。

Address Variable Dec Hex 
0x22ff4c a   9 0x09 
0x22ff48 b   10 0x0a 
0x22ff44 c   11 0x0b 
+0

[独自のロールあえて?](https://www.google.com/search?q=how+to+write+gdb+extensions) – alk

答えて

2

を、gdb python API これが追加されますさまざまなフォーマットのテーブルを出力するGDBコマンド varsに複数のパラメータを追加して、必要なテーブルを出力するのは難しくありません。

class Foo (gdb.Command): 
     """dereference and print in various formats""" 

     def __init__ (self): 
     super (Foo, self).__init__ ("foo", gdb.COMMAND_USER, gdb.COMPLETE_SYMBOL) 

     def invoke (self, arg, from_tty): 
     ptr = gdb.parse_and_eval("&" + str(arg)); 
     val = ptr.referenced_value(); 
     print('0x%x 0x%x %d' % (ptr, val, val)); 

Foo() 

と短い転写産物

(gdb) source foo.py 
(gdb) foo a 
0x7fffffffdebc 0x9 9 
(gdb) foo b 
0x7fffffffdeb8 0xa 10 
(gdb) foo c 
0x7fffffffdeb4 0xb 11 
1

あなたが望む方法でフォーマット出力、得ることはありませんけれどもあなたは、このためのuser-defined commandを定義することができます:ks1322のユーザ定義コマンドに加えて

define my_x 
    x $arg0 
    x/d $arg0 
end 
関連する問題