xref: /aosp_15_r20/tools/security/gdb/gdb_json_printer/README.md (revision d9ecfb0f4d734c9ce41cde8ac4d585b094fd4222)
1*d9ecfb0fSAndroid Build Coastguard Worker# gdb-json-pretty-printer
2*d9ecfb0fSAndroid Build Coastguard WorkerThis is a printer that prints variables in json format.
3*d9ecfb0fSAndroid Build Coastguard Worker## Install in GDB
4*d9ecfb0fSAndroid Build Coastguard WorkerCopy the content in gdbinit into your ~/.gdbinit, replace the path <path_to_gdb_json_printer> by the actual path of gdb_json_printer directory.
5*d9ecfb0fSAndroid Build Coastguard Worker## Run tests
6*d9ecfb0fSAndroid Build Coastguard WorkerFirst, in the gdb_json_printer directory, compile each example program with O0 optimization
7*d9ecfb0fSAndroid Build Coastguard Worker```
8*d9ecfb0fSAndroid Build Coastguard Workerg++ test_examples/basic_types.cpp -O0 -g -o test_examples/basic_types
9*d9ecfb0fSAndroid Build Coastguard Workerg++ test_examples/objects1.cpp -O0 -g -o test_examples/objects1
10*d9ecfb0fSAndroid Build Coastguard Workerg++ test_examples/objects2.cpp -O0 -g -o test_examples/objects2
11*d9ecfb0fSAndroid Build Coastguard Workerg++ test_examples/objects.cpp -O0 -g -o test_examples/objects
12*d9ecfb0fSAndroid Build Coastguard Workerg++ test_examples/array.cpp -O0 -g -o test_examples/array
13*d9ecfb0fSAndroid Build Coastguard Workerg++ test_examples/reference.cpp -O0 -g -o test_examples/reference
14*d9ecfb0fSAndroid Build Coastguard Worker```
15*d9ecfb0fSAndroid Build Coastguard Workersecond, run gdb in the gdb_json_printer directory:
16*d9ecfb0fSAndroid Build Coastguard Worker```
17*d9ecfb0fSAndroid Build Coastguard Workergdb
18*d9ecfb0fSAndroid Build Coastguard Worker```
19*d9ecfb0fSAndroid Build Coastguard Workerfinally, source the test script:
20*d9ecfb0fSAndroid Build Coastguard Worker```
21*d9ecfb0fSAndroid Build Coastguard Workersource test/gdb_json_printer_test.py
22*d9ecfb0fSAndroid Build Coastguard Worker```
23*d9ecfb0fSAndroid Build Coastguard Worker## printing format
24*d9ecfb0fSAndroid Build Coastguard Worker```
25*d9ecfb0fSAndroid Build Coastguard WorkerPointer := {
26*d9ecfb0fSAndroid Build Coastguard Worker  type: 'pointer',
27*d9ecfb0fSAndroid Build Coastguard Worker  ctype: ctype for pointer,
28*d9ecfb0fSAndroid Build Coastguard Worker  address: Address,
29*d9ecfb0fSAndroid Build Coastguard Worker  reference: Struct
30*d9ecfb0fSAndroid Build Coastguard Worker}
31*d9ecfb0fSAndroid Build Coastguard Worker
32*d9ecfb0fSAndroid Build Coastguard WorkerStruct := {
33*d9ecfb0fSAndroid Build Coastguard Worker  type: 'struct',
34*d9ecfb0fSAndroid Build Coastguard Worker  ctype: ctype for struct,
35*d9ecfb0fSAndroid Build Coastguard Worker  address: Address,
36*d9ecfb0fSAndroid Build Coastguard Worker  fields: StructField[]
37*d9ecfb0fSAndroid Build Coastguard Worker}
38*d9ecfb0fSAndroid Build Coastguard Worker
39*d9ecfb0fSAndroid Build Coastguard WorkerStructField := {
40*d9ecfb0fSAndroid Build Coastguard Worker  field: name of field,
41*d9ecfb0fSAndroid Build Coastguard Worker  field_type: 'base_class' or 'argument'
42*d9ecfb0fSAndroid Build Coastguard Worker  value: Value
43*d9ecfb0fSAndroid Build Coastguard Worker}
44*d9ecfb0fSAndroid Build Coastguard Worker
45*d9ecfb0fSAndroid Build Coastguard WorkerInt := {
46*d9ecfb0fSAndroid Build Coastguard Worker  type: 'int',
47*d9ecfb0fSAndroid Build Coastguard Worker  ctype: ctype for int,
48*d9ecfb0fSAndroid Build Coastguard Worker  address: Address,
49*d9ecfb0fSAndroid Build Coastguard Worker  value: number
50*d9ecfb0fSAndroid Build Coastguard Worker}
51*d9ecfb0fSAndroid Build Coastguard Worker
52*d9ecfb0fSAndroid Build Coastguard WorkerFloat := {
53*d9ecfb0fSAndroid Build Coastguard Worker  type: 'float',
54*d9ecfb0fSAndroid Build Coastguard Worker  ctype: 'float' or 'double',
55*d9ecfb0fSAndroid Build Coastguard Worker  address: Address,
56*d9ecfb0fSAndroid Build Coastguard Worker  value: number
57*d9ecfb0fSAndroid Build Coastguard Worker}
58*d9ecfb0fSAndroid Build Coastguard Worker
59*d9ecfb0fSAndroid Build Coastguard WorkerEnum := {
60*d9ecfb0fSAndroid Build Coastguard Worker  type: 'enum',
61*d9ecfb0fSAndroid Build Coastguard Worker  ctype: ctype for enum,
62*d9ecfb0fSAndroid Build Coastguard Worker  address: Address,
63*d9ecfb0fSAndroid Build Coastguard Worker  value: number
64*d9ecfb0fSAndroid Build Coastguard Worker}
65*d9ecfb0fSAndroid Build Coastguard Worker
66*d9ecfb0fSAndroid Build Coastguard WorkerVisit variable := {
67*d9ecfb0fSAndroid Build Coastguard Worker  type: 'visited',
68*d9ecfb0fSAndroid Build Coastguard Worker  ctype: ctype for struct,
69*d9ecfb0fSAndroid Build Coastguard Worker  address: Address,
70*d9ecfb0fSAndroid Build Coastguard Worker}
71*d9ecfb0fSAndroid Build Coastguard Worker
72*d9ecfb0fSAndroid Build Coastguard Worker```
73*d9ecfb0fSAndroid Build Coastguard Worker
74*d9ecfb0fSAndroid Build Coastguard Worker## problem to solve
75*d9ecfb0fSAndroid Build Coastguard Worker* support for print parent/child class members.
76*d9ecfb0fSAndroid Build Coastguard Worker* the printer treats all arrays as pointers now. We expected it to have ability to extract array/buffer length.
77*d9ecfb0fSAndroid Build Coastguard Worker* the printer prints smart pointers into a super complex json block. Maybe we need some specific printer for these common objects.