You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# Debug Native Executables with a Python Helper Script
8
8
9
-
### Debugging with _gdb-debughelpers.py_
10
-
9
+
Additionally to the [GDB debugging](debug-native-executables-with-gdb.md), you can debug a `native-image` process using a Python helper script, _gdb-debughelpers.py_.
11
10
The [GDB Python API](https://sourceware.org/gdb/current/onlinedocs/gdb/Python.html) is used to provide a reasonably good experience for debugging native executables or shared libraries.
12
11
It requires GDB with Python support.
13
12
The debugging extension is tested against GDB 13.2 and supports the new debuginfo generation introduced in GraalVM for JDK 17 and later.
14
13
15
-
> Note: The _gdb-debughelpers.py_ file does not work with versions older than version 13.2 of `gdb` or versions older than GraalVM for JDK17.
14
+
> Note: The _gdb-debughelpers.py_ file does not work with versions older than version 13.2 of `gdb` or versions older than GraalVM for JDK 17.
16
15
17
-
The Python script _gdb-debughelpers.py_ can be found in _<GRAALVM\_HOME>/lib/svm/debug_ directory.
16
+
The Python script _gdb-debughelpers.py_ can be found in the _<GRAALVM\_HOME>/lib/svm/debug_ directory.
18
17
If debuginfo generation is enabled (see [Build a Native Executable with Debug Information](debug-native-executables-with-gdb.md#build-a-native-executable-with-debug-information)), the script is copied to the build directory.
19
18
The `native-image` tool adds the debugging section `.debug_gdb_scripts` to the debug info file, which causes GDB to automatically load _gdb-debughelpers.py_ from the current working directory.
20
19
21
20
For [security reasons](https://sourceware.org/gdb/current/onlinedocs/gdb/Auto_002dloading-safe-path.html)
22
21
the first time GDB encounters a native executable or shared library that requests a specific Python file to be loaded it will print a warning:
23
22
24
-
> Reading symbols from svmbuild/images/<imagename>...
25
23
> warning: File "<CWD>/gdb-debughelpers.py" auto-loading has been declined by your `auto-load safe-path' set to "$debugdir:$datadir/auto-load".
26
24
>
27
25
> To enable execution of this file add
@@ -40,7 +38,7 @@ To solve this, either add the current working directory to _~/.gdbinit_ as follo
40
38
41
39
or pass the path as a command line argument to `gdb`:
Both enable GDB to auto-load _gdb-debughelpers.py_ from the current working directory.
46
44
@@ -49,117 +47,119 @@ However, it is possible to manually load the script from GDB explicitly with:
49
47
50
48
(gdb) source gdb-debughelpers.py
51
49
52
-
53
-
#### SVM Pretty Printing Support
50
+
## Pretty Printing Support
54
51
55
52
Loading _gdb-debughelpers.py_ registers a new pretty printer to GDB, which adds an extra level of convenience for debugging native executables or shared libraries.
56
53
This pretty printer handles the printing of Java Objects, Arrays, Strings, and Enums for debugging native executables or shared libraries.
57
54
If the Java application uses `@CStruct` and `@CPointer` annotations to access C data structures, the pretty printer will also try to print them as if they were Java data structures.
58
-
If the C data structures cannot be printed by the SVM pretty printer, printing is done by GDB.
55
+
If the C data structures cannot be printed by the pretty printer, printing is performed by GDB.
59
56
60
-
The pretty printer also supports printing of the primitive value instead of a Java Object for boxed primitives.
57
+
The pretty printer also prints of the primitive value of a boxed primitive (instead of a Java Object).
61
58
62
59
Whenever printing is done via the `p` alias of the `print` command the pretty printer intercepts that call to perform type casts to the respective runtime types of Java Objects.
63
60
This also applies for auto-completion when using the `p` alias.
64
61
This means that if the static type is different to the runtime type, the `print` command uses the static type, which leaves the user to discover the runtime type and typecast it.
65
62
Additionally, the `p` alias understands Java field and array access and function calls for Java Objects.
66
63
67
-
#####Limitations
64
+
#### Limitations
68
65
69
66
The `print` command still uses its default implementation, as there is no way to overwrite it, while still keeping the capability of the default `print` command.
70
67
Overriding would cause printing non-Java Objects to not work properly.
71
-
Therefore, only the `p` alias for the `print` command is overwritten by the SVM pretty printer, such that the user can still make use of the default GDB `print` command.
68
+
Therefore, only the `p` alias for the `print` command is overwritten by the pretty printer, such that the user can still make use of the default GDB `print` command.
72
69
70
+
### Options to Control the Pretty Printer Behavior
73
71
74
-
#### Options to Control the Behavior of the SVM Pretty Printer
75
-
76
-
In addition to the enhanced `p` alias, _gdb-debughelpers.py_ introduces some GDB parameters to customize the behavior of the SVM Pretty Printer.
72
+
In addition to the enhanced `p` alias, _gdb-debughelpers.py_ introduces some GDB parameters to customize the behavior of the pretty printer.
77
73
Parameters in GDB can be controlled with `set <param> <value>` and `show <param>` commands, and thus integrate with GDB's customization options.
78
74
79
-
*#####svm-print on/off
75
+
*#### svm-print on/off
80
76
81
-
Use this command to enable/disable the SVM Pretty Printer.
77
+
Use this command to enable/disable the pretty printer.
82
78
This also resets the `print` command alias `p` to its default behavior.
83
-
Alternatively SVM pretty printing can be suppressed with the
79
+
Alternatively pretty printing can be suppressed with the
84
80
[`raw` printing option of GDB's `print` command](https://sourceware.org/gdb/current/onlinedocs/gdb/Output-Formats.html):
85
81
86
82
(gdb) show svm-print
87
83
The current value of 'svm-print' is "on".
84
+
88
85
(gdb) print str
89
86
$1 = "string"
87
+
90
88
(gdb) print/r str
91
89
$2 = (java.lang.String *) 0x7ffff689d2d0
92
-
(gdb) set svm-print off
90
+
91
+
(gdb) set svm-print off
93
92
1 printer disabled
94
93
1 of 2 printers enabled
95
94
96
95
(gdb) print str
97
96
$3 = (java.lang.String *) 0x7ffff689d2d0
98
97
99
-
*#####svm-print-string-limit <int>
98
+
*#### svm-print-string-limit <int>
100
99
101
100
Customizes the maximum length for pretty printing a Java String.
102
101
The default value is `200`.
103
102
Set to `-1` or `unlimited` for unlimited printing of a Java String.
104
103
This does not change the limit for a C String, which can be controlled with GDB's `set print characters` command.
105
104
106
-
*#####svm-print-element-limit <int>
105
+
*#### svm-print-element-limit <int>
107
106
108
107
Customizes the maximum number of elements for pretty printing a Java Array, ArrayList, and HashMap.
109
108
The default value is `10`.
110
109
Set to `-1` or `unlimited` to print an unlimited number of elements.
111
110
This does not change the limit for a C array, which can be controlled with GDB's `set print elements` command.
112
111
However, GDB's parameter `print elements` is the upper bound for `svm-print-element-limit`.
113
112
114
-
*#####svm-print-field-limit <int>
113
+
*#### svm-print-field-limit <int>
115
114
116
115
Customizes the maximum number of elements for pretty printing fields of a Java Object.
117
116
The default value is `50`.
118
117
Set to `-1` or `unlimited` to print an unlimited number of fields.
119
118
GDB's parameter `print elements` is the upper bound for `svm-print-field-limit`.
120
119
121
-
*#####svm-print-depth-limit <int>
120
+
*#### svm-print-depth-limit <int>
122
121
123
-
Customizes the maximum depth of recursive svm pretty printing.
122
+
Customizes the maximum depth of recursive pretty printing.
124
123
The default value is `1`.
125
124
The children of direct children are printed (a sane default to make contents of boxed values visible).
126
125
Set to `-1` or `unlimited` to print unlimited depth.
127
126
GDB's parameter `print max-depth` is the upper bound for `svm-print-depth-limit`.
128
127
129
-
*#####svm-use-hlrep on/off
128
+
*#### svm-use-hlrep on/off
130
129
131
-
Use this command to enable/disable pretty printing for higher level representations.
130
+
Enables/disables pretty printing for higher level representations.
132
131
It provides a more data-oriented view on some Java data structures with a known internal structure such as Lists or Maps.
133
132
Currently supports ArrayList and HashMap.
134
133
135
-
*#####svm-infer-generics <int>
134
+
*#### svm-infer-generics <int>
136
135
137
136
Customizes the number of elements taken into account to infer the generic type of higher level representations.
138
137
The default value is `10`.
139
-
Set to `0` to not infer generic types and `-1` or `unlimited` to infer the generic type with all elements.
138
+
Set to `0` to not infer generic types and `-1` or `unlimited` to infer the generic type of all elements.
140
139
141
-
*#####svm-print-address absolute/on/off
140
+
*#### svm-print-address absolute/on/off
142
141
143
-
Use this command to enable/disable printing of addresses in addition to regular pretty printing.
142
+
Enables/disables printing of addresses in addition to regular pretty printing.
144
143
When `absolute` mode is used even compressed references are shown as absolute addresses.
145
144
Printing addresses is disabled by default.
146
145
147
-
*#####svm-print-static-fields on/off
146
+
*#### svm-print-static-fields on/off
148
147
149
-
Per default static field members are not shown during pretty printing of Java objects.
150
-
This command customizes this behavior.
148
+
Enables/disables printing of static fields for a Java Object.
149
+
Printing static fields is disabled by default.
151
150
152
-
*#####svm-complete-static-variables on/off
151
+
*#### svm-complete-static-variables on/off
153
152
154
-
Per default auto-completion for static fields is enabled for the enhanced `p` alias.
155
-
This command enables/disables completion for static field members.
153
+
Enables/disables auto-completion of static field members for the enhanced `p` alias.
154
+
Auto-completion of static fields is enabled by default.
156
155
157
-
*#####svm-selfref-check on/off
156
+
*#### svm-selfref-check on/off
158
157
159
-
To avoid endless recursion in pretty printing a self-referential data structure _gdb-debughelpers.py_ detects such cases and prevents further expansion.
158
+
Enables/disables self-reference checks for data structures.
159
+
The pretty printer detects a self-referential data structure and prevents further expansion to avoid endless recursion.
160
+
Self-reference checks are enabled by default.
160
161
For testing, this feature can be temporary disabled (usually you wouldn't want to do this).
0 commit comments