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.