gdbdump 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +3 -3
- data/lib/gdbdump/gdb.rb +9 -2
- data/lib/gdbdump/version.rb +1 -1
- data/vendor/ruby/2.1/gdbinit +882 -0
- data/vendor/ruby/2.2/gdbinit +916 -0
- data/vendor/ruby/2.3/2.3.0 +1 -0
- data/vendor/ruby/2.3/2.3.1 +1 -0
- data/vendor/ruby/2.3/2.3.2 +1 -0
- data/vendor/ruby/2.3/2.3.3 +1 -0
- data/vendor/ruby/{2.3.0 → 2.3}/gdbinit +0 -0
- data/vendor/ruby/{2.4.0 → 2.4}/gdbinit +0 -0
- metadata +9 -8
- data/vendor/ruby/2.3.1/gdbinit +0 -1
- data/vendor/ruby/2.3.2/gdbinit +0 -1
- data/vendor/ruby/2.3.3/gdbinit +0 -1
- data/vendor/ruby/2.3.4/gdbinit +0 -1
- data/vendor/ruby/2.4.1/gdbinit +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4404278dd2a252a8c175717c167a796adee717c6
|
4
|
+
data.tar.gz: 5b6e430c94796dab5eab7db5933c83757455c295
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb73707296f26c46c4c8e8def9a9cab0584e27c6f5c14d62b8b549cb90ca047ccaa8bd17c1dffcefa0063c5e46484f4ab0fc0f3f8d241093e5f38d5eb3136a25
|
7
|
+
data.tar.gz: 6c6ead8c0f79e04ace82dc5dc68fca17fdce94ece83a346110bab569505415b79308b6dd8c3bd281cb97ef4c7bbdcd3184a3f4a6df8d01942650d73f7f50237f
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -28,12 +28,12 @@ Usage: gdbdump [options] pid
|
|
28
28
|
|
29
29
|
### .gdbinit
|
30
30
|
|
31
|
-
Default supported ruby versions: 2.
|
31
|
+
Default supported ruby versions: 2.1.x - 2.4.x
|
32
32
|
|
33
33
|
Ruby trunk's [.gdbinit](https://github.com/ruby/ruby/blob/trunk/.gdbinit) file defines useful helper functions and it is maintained by ruby core team. `gdbdump` uses it.
|
34
|
-
Some versions of .gdbinit are bundled in this gem, but if you want to use `gdbdump` for older or newer ruby versions:
|
34
|
+
Some versions written as above of .gdbinit are bundled in this gem, but if you want to use `gdbdump` for older or newer ruby versions:
|
35
35
|
|
36
|
-
1. Download .gdbinit from ruby repo like https://github.com/ruby/ruby/blob/v2_4_1/.gdbinit, and specify with `-x` option
|
36
|
+
1. Download .gdbinit from ruby repo like [ruby/2.4.1/.gdbinit](https://github.com/ruby/ruby/blob/v2_4_1/.gdbinit), and specify with `-x` option
|
37
37
|
2. Or, send PR to bundle the .gdbinit in `gdbdump` gem.
|
38
38
|
|
39
39
|
## Example
|
data/lib/gdbdump/gdb.rb
CHANGED
@@ -14,11 +14,18 @@ class Gdbdump
|
|
14
14
|
@debug = debug
|
15
15
|
@gdb = gdb || 'gdb'
|
16
16
|
@ruby = ruby || Procfs.new(@pid).exe
|
17
|
-
@
|
18
|
-
@gdbinit = gdbinit || File.join(ROOT, 'vendor', 'ruby', @ruby_version, 'gdbinit')
|
17
|
+
@gdbinit = gdbinit || File.join(ROOT, 'vendor', 'ruby', ruby_minor_version, 'gdbinit')
|
19
18
|
@exec_options = [SUDO_CMD, @gdb, '-silent', '-nw', '-x', @gdbinit, @ruby, @pid]
|
20
19
|
end
|
21
20
|
|
21
|
+
private def ruby_version
|
22
|
+
`#{@ruby} -e 'puts RUBY_VERSION'`.chomp
|
23
|
+
end
|
24
|
+
|
25
|
+
private def ruby_minor_version
|
26
|
+
ruby_version.split('.')[0,2].join('.')
|
27
|
+
end
|
28
|
+
|
22
29
|
def print_backtrace
|
23
30
|
run do |gdb|
|
24
31
|
out, err = gdb.cmd_exec('rb_ps')
|
data/lib/gdbdump/version.rb
CHANGED
@@ -0,0 +1,882 @@
|
|
1
|
+
define hook-run
|
2
|
+
set $color_type = 0
|
3
|
+
set $color_highlite = 0
|
4
|
+
set $color_end = 0
|
5
|
+
end
|
6
|
+
|
7
|
+
define ruby_gdb_init
|
8
|
+
if !$color_type
|
9
|
+
set $color_type = "\033[31m"
|
10
|
+
end
|
11
|
+
if !$color_highlite
|
12
|
+
set $color_highlite = "\033[36m"
|
13
|
+
end
|
14
|
+
if !$color_end
|
15
|
+
set $color_end = "\033[m"
|
16
|
+
end
|
17
|
+
if ruby_dummy_gdb_enums.special_consts
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# set prompt \033[36m(gdb)\033[m\040
|
22
|
+
|
23
|
+
define rp
|
24
|
+
ruby_gdb_init
|
25
|
+
if (VALUE)($arg0) & RUBY_FIXNUM_FLAG
|
26
|
+
printf "FIXNUM: %ld\n", (long)($arg0) >> 1
|
27
|
+
else
|
28
|
+
if ((VALUE)($arg0) & ~(~(VALUE)0<<RUBY_SPECIAL_SHIFT)) == RUBY_SYMBOL_FLAG
|
29
|
+
set $id = (($arg0) >> RUBY_SPECIAL_SHIFT)
|
30
|
+
printf "%sSYMBOL%s: ", $color_type, $color_end
|
31
|
+
rp_id $id
|
32
|
+
else
|
33
|
+
if ($arg0) == RUBY_Qfalse
|
34
|
+
echo false\n
|
35
|
+
else
|
36
|
+
if ($arg0) == RUBY_Qtrue
|
37
|
+
echo true\n
|
38
|
+
else
|
39
|
+
if ($arg0) == RUBY_Qnil
|
40
|
+
echo nil\n
|
41
|
+
else
|
42
|
+
if ($arg0) == RUBY_Qundef
|
43
|
+
echo undef\n
|
44
|
+
else
|
45
|
+
if (VALUE)($arg0) & RUBY_IMMEDIATE_MASK
|
46
|
+
if ((VALUE)($arg0) & RUBY_FLONUM_MASK) == RUBY_FLONUM_FLAG
|
47
|
+
printf "%sFLONUM%s: %g\n", $color_type, $color_end, (double)rb_float_value($arg0)
|
48
|
+
else
|
49
|
+
echo immediate\n
|
50
|
+
end
|
51
|
+
else
|
52
|
+
set $flags = ((struct RBasic*)($arg0))->flags
|
53
|
+
if ($flags & RUBY_FL_PROMOTED)
|
54
|
+
printf "[PROMOTED] "
|
55
|
+
end
|
56
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_NONE
|
57
|
+
printf "%sT_NONE%s: ", $color_type, $color_end
|
58
|
+
print (struct RBasic *)($arg0)
|
59
|
+
else
|
60
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_NIL
|
61
|
+
printf "%sT_NIL%s: ", $color_type, $color_end
|
62
|
+
print (struct RBasic *)($arg0)
|
63
|
+
else
|
64
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_OBJECT
|
65
|
+
printf "%sT_OBJECT%s: ", $color_type, $color_end
|
66
|
+
print (struct RObject *)($arg0)
|
67
|
+
else
|
68
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_CLASS
|
69
|
+
printf "%sT_CLASS%s%s: ", $color_type, ($flags & RUBY_FL_SINGLETON) ? "*" : "", $color_end
|
70
|
+
rp_class $arg0
|
71
|
+
else
|
72
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_ICLASS
|
73
|
+
printf "%sT_ICLASS%s: ", $color_type, $color_end
|
74
|
+
rp_class $arg0
|
75
|
+
else
|
76
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_MODULE
|
77
|
+
printf "%sT_MODULE%s: ", $color_type, $color_end
|
78
|
+
rp_class $arg0
|
79
|
+
else
|
80
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_FLOAT
|
81
|
+
printf "%sT_FLOAT%s: %.16g ", $color_type, $color_end, (((struct RFloat*)($arg0))->float_value)
|
82
|
+
print (struct RFloat *)($arg0)
|
83
|
+
else
|
84
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_STRING
|
85
|
+
printf "%sT_STRING%s: ", $color_type, $color_end
|
86
|
+
rp_string $arg0 $flags
|
87
|
+
else
|
88
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_REGEXP
|
89
|
+
set $regsrc = ((struct RRegexp*)($arg0))->src
|
90
|
+
set $rsflags = ((struct RBasic*)$regsrc)->flags
|
91
|
+
printf "%sT_REGEXP%s: ", $color_type, $color_end
|
92
|
+
set print address off
|
93
|
+
output (char *)(($rsflags & RUBY_FL_USER1) ? \
|
94
|
+
((struct RString*)$regsrc)->as.heap.ptr : \
|
95
|
+
((struct RString*)$regsrc)->as.ary)
|
96
|
+
set print address on
|
97
|
+
printf " len:%ld ", ($rsflags & RUBY_FL_USER1) ? \
|
98
|
+
((struct RString*)$regsrc)->as.heap.len : \
|
99
|
+
(($rsflags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2)
|
100
|
+
if $flags & RUBY_FL_USER6
|
101
|
+
printf "(none) "
|
102
|
+
end
|
103
|
+
if $flags & RUBY_FL_USER5
|
104
|
+
printf "(literal) "
|
105
|
+
end
|
106
|
+
if $flags & RUBY_FL_USER4
|
107
|
+
printf "(fixed) "
|
108
|
+
end
|
109
|
+
printf "encoding:%d ", ($flags & RUBY_ENCODING_MASK) >> RUBY_ENCODING_SHIFT
|
110
|
+
print (struct RRegexp *)($arg0)
|
111
|
+
else
|
112
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_ARRAY
|
113
|
+
if ($flags & RUBY_FL_USER1)
|
114
|
+
set $len = (($flags & (RUBY_FL_USER3|RUBY_FL_USER4)) >> (RUBY_FL_USHIFT+3))
|
115
|
+
printf "%sT_ARRAY%s: len=%ld ", $color_type, $color_end, $len
|
116
|
+
printf "(embed) "
|
117
|
+
if ($len == 0)
|
118
|
+
printf "{(empty)} "
|
119
|
+
else
|
120
|
+
output/x *((VALUE*)((struct RArray*)($arg0))->as.ary) @ $len
|
121
|
+
printf " "
|
122
|
+
end
|
123
|
+
else
|
124
|
+
set $len = ((struct RArray*)($arg0))->as.heap.len
|
125
|
+
printf "%sT_ARRAY%s: len=%ld ", $color_type, $color_end, $len
|
126
|
+
if ($flags & RUBY_FL_USER2)
|
127
|
+
printf "(shared) shared="
|
128
|
+
output/x ((struct RArray*)($arg0))->as.heap.aux.shared
|
129
|
+
printf " "
|
130
|
+
else
|
131
|
+
printf "(ownership) capa=%ld ", ((struct RArray*)($arg0))->as.heap.aux.capa
|
132
|
+
end
|
133
|
+
if ($len == 0)
|
134
|
+
printf "{(empty)} "
|
135
|
+
else
|
136
|
+
output/x *((VALUE*)((struct RArray*)($arg0))->as.heap.ptr) @ $len
|
137
|
+
printf " "
|
138
|
+
end
|
139
|
+
end
|
140
|
+
print (struct RArray *)($arg0)
|
141
|
+
else
|
142
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_FIXNUM
|
143
|
+
printf "%sT_FIXNUM%s: ", $color_type, $color_end
|
144
|
+
print (struct RBasic *)($arg0)
|
145
|
+
else
|
146
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_HASH
|
147
|
+
printf "%sT_HASH%s: ", $color_type, $color_end,
|
148
|
+
if ((struct RHash *)($arg0))->ntbl
|
149
|
+
printf "len=%ld ", ((struct RHash *)($arg0))->ntbl->num_entries
|
150
|
+
end
|
151
|
+
print (struct RHash *)($arg0)
|
152
|
+
else
|
153
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_STRUCT
|
154
|
+
printf "%sT_STRUCT%s: len=%ld ", $color_type, $color_end, \
|
155
|
+
(($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \
|
156
|
+
($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) >> (RUBY_FL_USHIFT+1) : \
|
157
|
+
((struct RStruct *)($arg0))->as.heap.len)
|
158
|
+
print (struct RStruct *)($arg0)
|
159
|
+
x/xw (($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \
|
160
|
+
((struct RStruct *)($arg0))->as.ary : \
|
161
|
+
((struct RStruct *)($arg0))->as.heap.ptr)
|
162
|
+
else
|
163
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_BIGNUM
|
164
|
+
printf "%sT_BIGNUM%s: sign=%d len=%ld ", $color_type, $color_end, \
|
165
|
+
(($flags & RUBY_FL_USER1) != 0), \
|
166
|
+
(($flags & RUBY_FL_USER2) ? \
|
167
|
+
($flags & (RUBY_FL_USER5|RUBY_FL_USER4|RUBY_FL_USER3)) >> (RUBY_FL_USHIFT+3) : \
|
168
|
+
((struct RBignum*)($arg0))->as.heap.len)
|
169
|
+
if $flags & RUBY_FL_USER2
|
170
|
+
printf "(embed) "
|
171
|
+
end
|
172
|
+
print (struct RBignum *)($arg0)
|
173
|
+
x/xw (($flags & RUBY_FL_USER2) ? \
|
174
|
+
((struct RBignum*)($arg0))->as.ary : \
|
175
|
+
((struct RBignum*)($arg0))->as.heap.digits)
|
176
|
+
else
|
177
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_RATIONAL
|
178
|
+
printf "%sT_RATIONAL%s: ", $color_type, $color_end
|
179
|
+
print (struct RRational *)($arg0)
|
180
|
+
else
|
181
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_COMPLEX
|
182
|
+
printf "%sT_COMPLEX%s: ", $color_type, $color_end
|
183
|
+
print (struct RComplex *)($arg0)
|
184
|
+
else
|
185
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_FILE
|
186
|
+
printf "%sT_FILE%s: ", $color_type, $color_end
|
187
|
+
print (struct RFile *)($arg0)
|
188
|
+
output *((struct RFile *)($arg0))->fptr
|
189
|
+
printf "\n"
|
190
|
+
else
|
191
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_TRUE
|
192
|
+
printf "%sT_TRUE%s: ", $color_type, $color_end
|
193
|
+
print (struct RBasic *)($arg0)
|
194
|
+
else
|
195
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_FALSE
|
196
|
+
printf "%sT_FALSE%s: ", $color_type, $color_end
|
197
|
+
print (struct RBasic *)($arg0)
|
198
|
+
else
|
199
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_DATA
|
200
|
+
if ((struct RTypedData *)($arg0))->typed_flag == 1
|
201
|
+
printf "%sT_DATA%s(%s): ", $color_type, $color_end, ((struct RTypedData *)($arg0))->type->wrap_struct_name
|
202
|
+
print (struct RTypedData *)($arg0)
|
203
|
+
else
|
204
|
+
printf "%sT_DATA%s: ", $color_type, $color_end
|
205
|
+
print (struct RData *)($arg0)
|
206
|
+
end
|
207
|
+
else
|
208
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_MATCH
|
209
|
+
printf "%sT_MATCH%s: ", $color_type, $color_end
|
210
|
+
print (struct RMatch *)($arg0)
|
211
|
+
else
|
212
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_SYMBOL
|
213
|
+
printf "%sT_SYMBOL%s: ", $color_type, $color_end
|
214
|
+
print (struct RBasic *)($arg0)
|
215
|
+
else
|
216
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_UNDEF
|
217
|
+
printf "%sT_UNDEF%s: ", $color_type, $color_end
|
218
|
+
print (struct RBasic *)($arg0)
|
219
|
+
else
|
220
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_NODE
|
221
|
+
printf "%sT_NODE%s(", $color_type, $color_end
|
222
|
+
output (enum node_type)(($flags&RUBY_NODE_TYPEMASK)>>RUBY_NODE_TYPESHIFT)
|
223
|
+
printf "): "
|
224
|
+
print *(NODE *)($arg0)
|
225
|
+
else
|
226
|
+
if ($flags & RUBY_T_MASK) == RUBY_T_ZOMBIE
|
227
|
+
printf "%sT_ZOMBIE%s: ", $color_type, $color_end
|
228
|
+
print (struct RData *)($arg0)
|
229
|
+
else
|
230
|
+
printf "%sunknown%s: ", $color_type, $color_end
|
231
|
+
print (struct RBasic *)($arg0)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
document rp
|
266
|
+
Print a Ruby's VALUE.
|
267
|
+
end
|
268
|
+
|
269
|
+
define rp_id
|
270
|
+
set $id = (ID)$arg0
|
271
|
+
if $id == '!' || $id == '+' || $id == '-' || $id == '*' || $id == '/' || $id == '%' || $id == '<' || $id == '>' || $id == '`'
|
272
|
+
printf "(:%c)\n", $id
|
273
|
+
else
|
274
|
+
if $id == idDot2
|
275
|
+
printf "(:..)\n"
|
276
|
+
else
|
277
|
+
if $id == idDot3
|
278
|
+
printf "(:...)\n"
|
279
|
+
else
|
280
|
+
if $id == idUPlus
|
281
|
+
printf "(:+@)\n"
|
282
|
+
else
|
283
|
+
if $id == idUMinus
|
284
|
+
printf "(:-@)\n"
|
285
|
+
else
|
286
|
+
if $id == idPow
|
287
|
+
printf "(:**)\n"
|
288
|
+
else
|
289
|
+
if $id == idCmp
|
290
|
+
printf "(:<=>)\n"
|
291
|
+
else
|
292
|
+
if $id == idLTLT
|
293
|
+
printf "(:<<)\n"
|
294
|
+
else
|
295
|
+
if $id == idLE
|
296
|
+
printf "(:<=)\n"
|
297
|
+
else
|
298
|
+
if $id == idGE
|
299
|
+
printf "(:>=)\n"
|
300
|
+
else
|
301
|
+
if $id == idEq
|
302
|
+
printf "(:==)\n"
|
303
|
+
else
|
304
|
+
if $id == idEqq
|
305
|
+
printf "(:===)\n"
|
306
|
+
else
|
307
|
+
if $id == idNeq
|
308
|
+
printf "(:!=)\n"
|
309
|
+
else
|
310
|
+
if $id == idEqTilde
|
311
|
+
printf "(:=~)\n"
|
312
|
+
else
|
313
|
+
if $id == idNeqTilde
|
314
|
+
printf "(:!~)\n"
|
315
|
+
else
|
316
|
+
if $id == idAREF
|
317
|
+
printf "(:[])\n"
|
318
|
+
else
|
319
|
+
if $id == idASET
|
320
|
+
printf "(:[]=)\n"
|
321
|
+
else
|
322
|
+
if $id <= tLAST_OP_ID
|
323
|
+
printf "O"
|
324
|
+
else
|
325
|
+
set $id_type = $id & RUBY_ID_SCOPE_MASK
|
326
|
+
if $id_type == RUBY_ID_LOCAL
|
327
|
+
printf "l"
|
328
|
+
else
|
329
|
+
if $id_type == RUBY_ID_INSTANCE
|
330
|
+
printf "i"
|
331
|
+
else
|
332
|
+
if $id_type == RUBY_ID_GLOBAL
|
333
|
+
printf "G"
|
334
|
+
else
|
335
|
+
if $id_type == RUBY_ID_ATTRSET
|
336
|
+
printf "a"
|
337
|
+
else
|
338
|
+
if $id_type == RUBY_ID_CONST
|
339
|
+
printf "C"
|
340
|
+
else
|
341
|
+
if $id_type == RUBY_ID_CLASS
|
342
|
+
printf "c"
|
343
|
+
else
|
344
|
+
printf "j"
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
printf "(%ld): ", $id
|
353
|
+
rb_numtable_entry global_symbols.id_str $id
|
354
|
+
if $rb_numtable_rec
|
355
|
+
rp_string $rb_numtable_rec
|
356
|
+
else
|
357
|
+
echo undef\n
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
document rp_id
|
378
|
+
Print an ID.
|
379
|
+
end
|
380
|
+
|
381
|
+
define rp_string
|
382
|
+
set $flags = ((struct RBasic*)($arg0))->flags
|
383
|
+
set print address off
|
384
|
+
output (char *)(($flags & RUBY_FL_USER1) ? \
|
385
|
+
((struct RString*)($arg0))->as.heap.ptr : \
|
386
|
+
((struct RString*)($arg0))->as.ary)
|
387
|
+
set print address on
|
388
|
+
printf " bytesize:%ld ", ($flags & RUBY_FL_USER1) ? \
|
389
|
+
((struct RString*)($arg0))->as.heap.len : \
|
390
|
+
(($flags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2)
|
391
|
+
if !($flags & RUBY_FL_USER1)
|
392
|
+
printf "(embed) "
|
393
|
+
else
|
394
|
+
if ($flags & RUBY_FL_USER2)
|
395
|
+
printf "(shared) "
|
396
|
+
end
|
397
|
+
if ($flags & RUBY_FL_USER3)
|
398
|
+
printf "(assoc) "
|
399
|
+
end
|
400
|
+
end
|
401
|
+
printf "encoding:%d ", ($flags & RUBY_ENCODING_MASK) >> RUBY_ENCODING_SHIFT
|
402
|
+
if ($flags & RUBY_ENC_CODERANGE_MASK) == 0
|
403
|
+
printf "coderange:unknown "
|
404
|
+
else
|
405
|
+
if ($flags & RUBY_ENC_CODERANGE_MASK) == RUBY_ENC_CODERANGE_7BIT
|
406
|
+
printf "coderange:7bit "
|
407
|
+
else
|
408
|
+
if ($flags & RUBY_ENC_CODERANGE_MASK) == RUBY_ENC_CODERANGE_VALID
|
409
|
+
printf "coderange:valid "
|
410
|
+
else
|
411
|
+
printf "coderange:broken "
|
412
|
+
end
|
413
|
+
end
|
414
|
+
end
|
415
|
+
print (struct RString *)($arg0)
|
416
|
+
end
|
417
|
+
document rp_string
|
418
|
+
Print the content of a String.
|
419
|
+
end
|
420
|
+
|
421
|
+
define rp_class
|
422
|
+
printf "(struct RClass *) %p", (void*)$arg0
|
423
|
+
if ((struct RClass *)($arg0))->ptr.origin != $arg0
|
424
|
+
printf " -> %p", ((struct RClass *)($arg0))->ptr.origin
|
425
|
+
end
|
426
|
+
printf "\n"
|
427
|
+
rb_classname $arg0
|
428
|
+
print *(struct RClass *)($arg0)
|
429
|
+
print *((struct RClass *)($arg0))->ptr
|
430
|
+
end
|
431
|
+
document rp_class
|
432
|
+
Print the content of a Class/Module.
|
433
|
+
end
|
434
|
+
|
435
|
+
define nd_type
|
436
|
+
print (enum node_type)((((NODE*)($arg0))->flags&RUBY_NODE_TYPEMASK)>>RUBY_NODE_TYPESHIFT)
|
437
|
+
end
|
438
|
+
document nd_type
|
439
|
+
Print a Ruby' node type.
|
440
|
+
end
|
441
|
+
|
442
|
+
define nd_file
|
443
|
+
print ((NODE*)($arg0))->nd_file
|
444
|
+
end
|
445
|
+
document nd_file
|
446
|
+
Print the source file name of a node.
|
447
|
+
end
|
448
|
+
|
449
|
+
define nd_line
|
450
|
+
print ((unsigned int)((((NODE*)($arg0))->flags>>RUBY_NODE_LSHIFT)&RUBY_NODE_LMASK))
|
451
|
+
end
|
452
|
+
document nd_line
|
453
|
+
Print the source line number of a node.
|
454
|
+
end
|
455
|
+
|
456
|
+
# Print members of ruby node.
|
457
|
+
|
458
|
+
define nd_head
|
459
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
460
|
+
rp ($arg0).u1.node
|
461
|
+
end
|
462
|
+
|
463
|
+
define nd_alen
|
464
|
+
printf "%su2.argc%s: ", $color_highlite, $color_end
|
465
|
+
p ($arg0).u2.argc
|
466
|
+
end
|
467
|
+
|
468
|
+
define nd_next
|
469
|
+
printf "%su3.node%s: ", $color_highlite, $color_end
|
470
|
+
rp ($arg0).u3.node
|
471
|
+
end
|
472
|
+
|
473
|
+
|
474
|
+
define nd_cond
|
475
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
476
|
+
rp ($arg0).u1.node
|
477
|
+
end
|
478
|
+
|
479
|
+
define nd_body
|
480
|
+
printf "%su2.node%s: ", $color_highlite, $color_end
|
481
|
+
rp ($arg0).u2.node
|
482
|
+
end
|
483
|
+
|
484
|
+
define nd_else
|
485
|
+
printf "%su3.node%s: ", $color_highlite, $color_end
|
486
|
+
rp ($arg0).u3.node
|
487
|
+
end
|
488
|
+
|
489
|
+
|
490
|
+
define nd_orig
|
491
|
+
printf "%su3.value%s: ", $color_highlite, $color_end
|
492
|
+
rp ($arg0).u3.value
|
493
|
+
end
|
494
|
+
|
495
|
+
|
496
|
+
define nd_resq
|
497
|
+
printf "%su2.node%s: ", $color_highlite, $color_end
|
498
|
+
rp ($arg0).u2.node
|
499
|
+
end
|
500
|
+
|
501
|
+
define nd_ensr
|
502
|
+
printf "%su3.node%s: ", $color_highlite, $color_end
|
503
|
+
rp ($arg0).u3.node
|
504
|
+
end
|
505
|
+
|
506
|
+
|
507
|
+
define nd_1st
|
508
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
509
|
+
rp ($arg0).u1.node
|
510
|
+
end
|
511
|
+
|
512
|
+
define nd_2nd
|
513
|
+
printf "%su2.node%s: ", $color_highlite, $color_end
|
514
|
+
rp ($arg0).u2.node
|
515
|
+
end
|
516
|
+
|
517
|
+
|
518
|
+
define nd_stts
|
519
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
520
|
+
rp ($arg0).u1.node
|
521
|
+
end
|
522
|
+
|
523
|
+
|
524
|
+
define nd_entry
|
525
|
+
printf "%su3.entry%s: ", $color_highlite, $color_end
|
526
|
+
p ($arg0).u3.entry
|
527
|
+
end
|
528
|
+
|
529
|
+
define nd_vid
|
530
|
+
printf "%su1.id%s: ", $color_highlite, $color_end
|
531
|
+
p ($arg0).u1.id
|
532
|
+
end
|
533
|
+
|
534
|
+
define nd_cflag
|
535
|
+
printf "%su2.id%s: ", $color_highlite, $color_end
|
536
|
+
p ($arg0).u2.id
|
537
|
+
end
|
538
|
+
|
539
|
+
define nd_cval
|
540
|
+
printf "%su3.value%s: ", $color_highlite, $color_end
|
541
|
+
rp ($arg0).u3.value
|
542
|
+
end
|
543
|
+
|
544
|
+
|
545
|
+
define nd_cnt
|
546
|
+
printf "%su3.cnt%s: ", $color_highlite, $color_end
|
547
|
+
p ($arg0).u3.cnt
|
548
|
+
end
|
549
|
+
|
550
|
+
define nd_tbl
|
551
|
+
printf "%su1.tbl%s: ", $color_highlite, $color_end
|
552
|
+
p ($arg0).u1.tbl
|
553
|
+
end
|
554
|
+
|
555
|
+
|
556
|
+
define nd_var
|
557
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
558
|
+
rp ($arg0).u1.node
|
559
|
+
end
|
560
|
+
|
561
|
+
define nd_ibdy
|
562
|
+
printf "%su2.node%s: ", $color_highlite, $color_end
|
563
|
+
rp ($arg0).u2.node
|
564
|
+
end
|
565
|
+
|
566
|
+
define nd_iter
|
567
|
+
printf "%su3.node%s: ", $color_highlite, $color_end
|
568
|
+
rp ($arg0).u3.node
|
569
|
+
end
|
570
|
+
|
571
|
+
|
572
|
+
define nd_value
|
573
|
+
printf "%su2.node%s: ", $color_highlite, $color_end
|
574
|
+
rp ($arg0).u2.node
|
575
|
+
end
|
576
|
+
|
577
|
+
define nd_aid
|
578
|
+
printf "%su3.id%s: ", $color_highlite, $color_end
|
579
|
+
p ($arg0).u3.id
|
580
|
+
end
|
581
|
+
|
582
|
+
|
583
|
+
define nd_lit
|
584
|
+
printf "%su1.value%s: ", $color_highlite, $color_end
|
585
|
+
rp ($arg0).u1.value
|
586
|
+
end
|
587
|
+
|
588
|
+
|
589
|
+
define nd_frml
|
590
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
591
|
+
rp ($arg0).u1.node
|
592
|
+
end
|
593
|
+
|
594
|
+
define nd_rest
|
595
|
+
printf "%su2.argc%s: ", $color_highlite, $color_end
|
596
|
+
p ($arg0).u2.argc
|
597
|
+
end
|
598
|
+
|
599
|
+
define nd_opt
|
600
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
601
|
+
rp ($arg0).u1.node
|
602
|
+
end
|
603
|
+
|
604
|
+
|
605
|
+
define nd_recv
|
606
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
607
|
+
rp ($arg0).u1.node
|
608
|
+
end
|
609
|
+
|
610
|
+
define nd_mid
|
611
|
+
printf "%su2.id%s: ", $color_highlite, $color_end
|
612
|
+
p ($arg0).u2.id
|
613
|
+
end
|
614
|
+
|
615
|
+
define nd_args
|
616
|
+
printf "%su3.node%s: ", $color_highlite, $color_end
|
617
|
+
rp ($arg0).u3.node
|
618
|
+
end
|
619
|
+
|
620
|
+
|
621
|
+
define nd_noex
|
622
|
+
printf "%su1.id%s: ", $color_highlite, $color_end
|
623
|
+
p ($arg0).u1.id
|
624
|
+
end
|
625
|
+
|
626
|
+
define nd_defn
|
627
|
+
printf "%su3.node%s: ", $color_highlite, $color_end
|
628
|
+
rp ($arg0).u3.node
|
629
|
+
end
|
630
|
+
|
631
|
+
|
632
|
+
define nd_old
|
633
|
+
printf "%su1.id%s: ", $color_highlite, $color_end
|
634
|
+
p ($arg0).u1.id
|
635
|
+
end
|
636
|
+
|
637
|
+
define nd_new
|
638
|
+
printf "%su2.id%s: ", $color_highlite, $color_end
|
639
|
+
p ($arg0).u2.id
|
640
|
+
end
|
641
|
+
|
642
|
+
|
643
|
+
define nd_cfnc
|
644
|
+
printf "%su1.cfunc%s: ", $color_highlite, $color_end
|
645
|
+
p ($arg0).u1.cfunc
|
646
|
+
end
|
647
|
+
|
648
|
+
define nd_argc
|
649
|
+
printf "%su2.argc%s: ", $color_highlite, $color_end
|
650
|
+
p ($arg0).u2.argc
|
651
|
+
end
|
652
|
+
|
653
|
+
|
654
|
+
define nd_cname
|
655
|
+
printf "%su1.id%s: ", $color_highlite, $color_end
|
656
|
+
p ($arg0).u1.id
|
657
|
+
end
|
658
|
+
|
659
|
+
define nd_super
|
660
|
+
printf "%su3.node%s: ", $color_highlite, $color_end
|
661
|
+
rp ($arg0).u3.node
|
662
|
+
end
|
663
|
+
|
664
|
+
|
665
|
+
define nd_modl
|
666
|
+
printf "%su1.id%s: ", $color_highlite, $color_end
|
667
|
+
p ($arg0).u1.id
|
668
|
+
end
|
669
|
+
|
670
|
+
define nd_clss
|
671
|
+
printf "%su1.value%s: ", $color_highlite, $color_end
|
672
|
+
rp ($arg0).u1.value
|
673
|
+
end
|
674
|
+
|
675
|
+
|
676
|
+
define nd_beg
|
677
|
+
printf "%su1.node%s: ", $color_highlite, $color_end
|
678
|
+
rp ($arg0).u1.node
|
679
|
+
end
|
680
|
+
|
681
|
+
define nd_end
|
682
|
+
printf "%su2.node%s: ", $color_highlite, $color_end
|
683
|
+
rp ($arg0).u2.node
|
684
|
+
end
|
685
|
+
|
686
|
+
define nd_state
|
687
|
+
printf "%su3.state%s: ", $color_highlite, $color_end
|
688
|
+
p ($arg0).u3.state
|
689
|
+
end
|
690
|
+
|
691
|
+
define nd_rval
|
692
|
+
printf "%su2.value%s: ", $color_highlite, $color_end
|
693
|
+
rp ($arg0).u2.value
|
694
|
+
end
|
695
|
+
|
696
|
+
|
697
|
+
define nd_nth
|
698
|
+
printf "%su2.argc%s: ", $color_highlite, $color_end
|
699
|
+
p ($arg0).u2.argc
|
700
|
+
end
|
701
|
+
|
702
|
+
|
703
|
+
define nd_tag
|
704
|
+
printf "%su1.id%s: ", $color_highlite, $color_end
|
705
|
+
p ($arg0).u1.id
|
706
|
+
end
|
707
|
+
|
708
|
+
define nd_tval
|
709
|
+
printf "%su2.value%s: ", $color_highlite, $color_end
|
710
|
+
rp ($arg0).u2.value
|
711
|
+
end
|
712
|
+
|
713
|
+
define rb_p
|
714
|
+
call rb_p($arg0)
|
715
|
+
end
|
716
|
+
|
717
|
+
define rb_numtable_entry
|
718
|
+
set $rb_numtable_tbl = $arg0
|
719
|
+
set $rb_numtable_id = (st_data_t)$arg1
|
720
|
+
set $rb_numtable_key = 0
|
721
|
+
set $rb_numtable_rec = 0
|
722
|
+
if $rb_numtable_tbl->entries_packed
|
723
|
+
set $rb_numtable_p = $rb_numtable_tbl->as.packed.bins
|
724
|
+
while $rb_numtable_p && $rb_numtable_p < $rb_numtable_tbl->as.packed.bins+$rb_numtable_tbl->num_entries
|
725
|
+
if $rb_numtable_p.k == $rb_numtable_id
|
726
|
+
set $rb_numtable_key = $rb_numtable_p.k
|
727
|
+
set $rb_numtable_rec = $rb_numtable_p.v
|
728
|
+
set $rb_numtable_p = 0
|
729
|
+
else
|
730
|
+
set $rb_numtable_p = $rb_numtable_p + 1
|
731
|
+
end
|
732
|
+
end
|
733
|
+
else
|
734
|
+
set $rb_numtable_p = $rb_numtable_tbl->as.big.bins[$rb_numtable_id % $rb_numtable_tbl->num_bins]
|
735
|
+
while $rb_numtable_p
|
736
|
+
if $rb_numtable_p->key == $rb_numtable_id
|
737
|
+
set $rb_numtable_key = $rb_numtable_p->key
|
738
|
+
set $rb_numtable_rec = $rb_numtable_p->record
|
739
|
+
set $rb_numtable_p = 0
|
740
|
+
else
|
741
|
+
set $rb_numtable_p = $rb_numtable_p->next
|
742
|
+
end
|
743
|
+
end
|
744
|
+
end
|
745
|
+
end
|
746
|
+
|
747
|
+
define rb_id2name
|
748
|
+
ruby_gdb_init
|
749
|
+
printf "%sID%s: ", $color_type, $color_end
|
750
|
+
rp_id $arg0
|
751
|
+
end
|
752
|
+
document rb_id2name
|
753
|
+
Print the name of id
|
754
|
+
end
|
755
|
+
|
756
|
+
define rb_method_entry
|
757
|
+
set $rb_method_entry_klass = (struct RClass *)$arg0
|
758
|
+
set $rb_method_entry_id = (ID)$arg1
|
759
|
+
set $rb_method_entry_me = (rb_method_entry_t *)0
|
760
|
+
while !$rb_method_entry_me && $rb_method_entry_klass
|
761
|
+
rb_numtable_entry $rb_method_entry_klass->m_tbl_wrapper->tbl $rb_method_entry_id
|
762
|
+
set $rb_method_entry_me = (rb_method_entry_t *)$rb_numtable_rec
|
763
|
+
if !$rb_method_entry_me
|
764
|
+
set $rb_method_entry_klass = (struct RClass *)$rb_method_entry_klass->ptr->super
|
765
|
+
end
|
766
|
+
end
|
767
|
+
if $rb_method_entry_me
|
768
|
+
print *$rb_method_entry_klass
|
769
|
+
print *$rb_method_entry_me
|
770
|
+
else
|
771
|
+
echo method not found\n
|
772
|
+
end
|
773
|
+
end
|
774
|
+
document rb_method_entry
|
775
|
+
Search method entry by class and id
|
776
|
+
end
|
777
|
+
|
778
|
+
define rb_classname
|
779
|
+
# up to 128bit int
|
780
|
+
set $rb_classname_permanent = "0123456789ABCDEF"
|
781
|
+
set $rb_classname = classname($arg0, $rb_classname_permanent)
|
782
|
+
if $rb_classname != RUBY_Qnil
|
783
|
+
rp $rb_classname
|
784
|
+
else
|
785
|
+
echo anonymous class/module\n
|
786
|
+
end
|
787
|
+
end
|
788
|
+
|
789
|
+
define rb_ancestors
|
790
|
+
set $rb_ancestors_module = $arg0
|
791
|
+
while $rb_ancestors_module
|
792
|
+
rp_class $rb_ancestors_module
|
793
|
+
set $rb_ancestors_module = ((struct RClass *)($rb_ancestors_module))->ptr.super
|
794
|
+
end
|
795
|
+
end
|
796
|
+
document rb_ancestors
|
797
|
+
Print ancestors.
|
798
|
+
end
|
799
|
+
|
800
|
+
define rb_backtrace
|
801
|
+
call rb_backtrace()
|
802
|
+
end
|
803
|
+
|
804
|
+
define iseq
|
805
|
+
if ruby_dummy_gdb_enums.special_consts
|
806
|
+
end
|
807
|
+
if ($arg0)->type == ISEQ_ELEMENT_NONE
|
808
|
+
echo [none]\n
|
809
|
+
end
|
810
|
+
if ($arg0)->type == ISEQ_ELEMENT_LABEL
|
811
|
+
print *(LABEL*)($arg0)
|
812
|
+
end
|
813
|
+
if ($arg0)->type == ISEQ_ELEMENT_INSN
|
814
|
+
print *(INSN*)($arg0)
|
815
|
+
if ((INSN*)($arg0))->insn_id != YARVINSN_jump
|
816
|
+
set $i = 0
|
817
|
+
set $operand_size = ((INSN*)($arg0))->operand_size
|
818
|
+
set $operands = ((INSN*)($arg0))->operands
|
819
|
+
while $i < $operand_size
|
820
|
+
rp $operands[$i++]
|
821
|
+
end
|
822
|
+
end
|
823
|
+
end
|
824
|
+
if ($arg0)->type == ISEQ_ELEMENT_ADJUST
|
825
|
+
print *(ADJUST*)($arg0)
|
826
|
+
end
|
827
|
+
end
|
828
|
+
|
829
|
+
define rb_ps
|
830
|
+
rb_ps_vm ruby_current_vm
|
831
|
+
end
|
832
|
+
document rb_ps
|
833
|
+
Dump all threads and their callstacks
|
834
|
+
end
|
835
|
+
|
836
|
+
define rb_ps_vm
|
837
|
+
print $ps_vm = (rb_vm_t*)$arg0
|
838
|
+
set $ps_threads = (st_table*)$ps_vm->living_threads
|
839
|
+
if $ps_threads->entries_packed
|
840
|
+
set $ps_threads_i = 0
|
841
|
+
while $ps_threads_i < $ps_threads->num_entries
|
842
|
+
set $ps_threads_key = (st_data_t)$ps_threads->as.packed.entries[$ps_threads_i].key
|
843
|
+
set $ps_threads_val = (st_data_t)$ps_threads->as.packed.entries[$ps_threads_i].val
|
844
|
+
rb_ps_thread $ps_threads_key $ps_threads_val
|
845
|
+
set $ps_threads_i = $ps_threads_i + 1
|
846
|
+
end
|
847
|
+
else
|
848
|
+
set $ps_threads_ptr = (st_table_entry*)$ps_threads->head
|
849
|
+
while $ps_threads_ptr
|
850
|
+
set $ps_threads_key = (st_data_t)$ps_threads_ptr->key
|
851
|
+
set $ps_threads_val = (st_data_t)$ps_threads_ptr->record
|
852
|
+
rb_ps_thread $ps_threads_key $ps_threads_val
|
853
|
+
set $ps_threads_ptr = (st_table_entry*)$ps_threads_ptr->fore
|
854
|
+
end
|
855
|
+
end
|
856
|
+
end
|
857
|
+
document rb_ps_vm
|
858
|
+
Dump all threads in a (rb_vm_t*) and their callstacks
|
859
|
+
end
|
860
|
+
|
861
|
+
define rb_ps_thread
|
862
|
+
set $ps_thread = (struct RTypedData*)$arg0
|
863
|
+
set $ps_thread_id = $arg1
|
864
|
+
print $ps_thread_th = (rb_thread_t*)$ps_thread->data
|
865
|
+
end
|
866
|
+
|
867
|
+
# Details: https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/MachineInstructionsTraceWithGDB
|
868
|
+
define trace_machine_instructions
|
869
|
+
set logging on
|
870
|
+
set height 0
|
871
|
+
set width 0
|
872
|
+
display/i $pc
|
873
|
+
while !$exit_code
|
874
|
+
info line *$pc
|
875
|
+
si
|
876
|
+
end
|
877
|
+
end
|
878
|
+
|
879
|
+
define SDR
|
880
|
+
call rb_vmdebug_stack_dump_raw_current()
|
881
|
+
end
|
882
|
+
|