Es gibt mehr Möglichkeiten, Variablen Werte aus der GDB-Befehlszeile zu drucken.
print Arbeiten auf Ausdrücke und werden einige implizite Konvertierungen tun, ebenso wie C der Fall ist.
p /t a
in Ihrem Beispiel einen Wert auf eine ganze Zahl und drucken es in Basis 2
Sie wandeln auf a
‚s Bitmuster, so gibt es ein paar Optionen mit print
aussehen wollte:
- Sie können ihre Adresse auf einen Zeiger auf einen vorzeichenlosen Integer-Typ mit der gleichen Länge wie in einem Double-Format - wahrscheinlich
unsigned long long
oder uint64_t
in Ihrem Beispiel - umwandeln und dies dereferenzieren.
(gdb) p /t *(uint64_t *)&a
$6 = 100000001011010110000000000000000000000000000000000000000000000
- können Sie
{uint64_t}
verwenden, um die gleiche Sache prägnanter zu erreichen.
(gdb) p /t {uint64_t}&a
$7 = 100000001011010110000000000000000000000000000000000000000000000
x zeigt die Daten an einer bestimmten Adresse, und Sie können den Datentyp angeben. /g
bedeutet eine 8-Byte-Ganzzahl.
(gdb) x /tg &a
0x7fffffffded8: 0100000001011010110000000000000000000000000000000000000000000000
Wenn Sie Optimierung verwenden, ist es möglich, dass a
in einem Register sein, und Sie werden nicht in der Lage sein, seine Adresse zu nehmen, so dass keiner der oben arbeiten.
(gdb) p {uint64_t}&a
Address requested for identifier "a" which is in register $ymm0
Aber gdb
unterstützt den Inhalt von AVX Registern in verschiedenen Formaten drucken, Syntax unter Verwendung einer C Union von Anordnungen ähnelt.
(gdb) p $ymm0
$1 = {v8_float = {0, 3.41796875, 0, 0, 0, 0, 0, 0},
v4_double = {107, 0, 0, 0}, v32_int8 = {0, 0, 0, 0, 0, -64, 90,
64, 0 <repeats 24 times>},
v16_int16 = {0, 0, -16384, 16474, 0 <repeats 12 times>},
v8_int32 = {0, 1079689216, 0, 0, 0, 0, 0, 0},
v4_int64 = {4637229872563879936, 0, 0, 0},
v2_int128 = {0x0000000000000000405ac00000000000, 0x00000000000000000000000000000000}}
(gdb) p /t $ymm0.v4_int64[0]
$2 = 100000001011010110000000000000000000000000000000000000000000000
'/ t' bedeutet nicht das Drucken des Bitmusters, es bedeutet nur eine Basis 2 Darstellung des Wertes, der Wert selbst ist 107 (gdb kennt den Typ Ihres' a'). Um das Bitmuster herauszufinden, verwenden Sie den Befehl 'x'. – ach