heapinfo 0.0.1 → 0.0.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/lib/heapinfo/arena.rb +42 -10
- data/lib/heapinfo/chunks.rb +1 -0
- data/lib/heapinfo/ext/string.rb +8 -0
- data/lib/heapinfo/libc.rb +14 -2
- data/lib/heapinfo/process.rb +2 -1
- data/lib/heapinfo/process_info.rb +10 -1
- data/lib/heapinfo/segment.rb +1 -0
- data/lib/heapinfo/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd09327165de603d3fa3350e9022d8bf642a1f7c
|
4
|
+
data.tar.gz: 5c1dd70e46c5fad709e187c25a8347be8262586e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6827c2c7129162b716046200e71cdba7475de9edad4a1880b0aec374c3e9a5649c6a2ae934566097794671bc1c30d255e4fed9142e6a1de4b95a914f3c8c5ee1
|
7
|
+
data.tar.gz: 82bfd1db1bca104fa62d54e7c14a63ad91d2a208dfa346d8a23464141d9767e1f9d18dda21dfd106a840d2799c92c3d4dad2a78893b4bcbc224aa9c415f38692
|
data/lib/heapinfo/arena.rb
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
module HeapInfo
|
2
|
+
# Records status of an arena, including bin(s) and top chunk.
|
2
3
|
class Arena
|
3
|
-
|
4
|
+
# @return [Array<HeapInfo::Fastbin>] Fastbins in an array.
|
5
|
+
attr_reader :fastbin
|
6
|
+
# @return [Array<HeapInfo::UnsortedBin>] The unsorted bin (only one).
|
7
|
+
attr_reader :unsorted_bin
|
8
|
+
# @return [Array<HeapInfo::Smallbin>] Smallbins in an array.
|
9
|
+
attr_reader :smallbin
|
10
|
+
# @return [HeapInfo::Chunk] Current top chunk.
|
11
|
+
attr_reader :top_chunk
|
4
12
|
# attr_reader :largebin, :last_remainder
|
5
13
|
|
6
|
-
# Instantiate a <tt>HeapInfo::Arena</tt> object
|
14
|
+
# Instantiate a <tt>HeapInfo::Arena</tt> object.
|
7
15
|
#
|
8
16
|
# @param [Integer] base Base address of arena.
|
9
17
|
# @param [Integer] bits Either 64 or 32
|
@@ -14,7 +22,7 @@ module HeapInfo
|
|
14
22
|
reload!
|
15
23
|
end
|
16
24
|
|
17
|
-
# Refresh all attributes
|
25
|
+
# Refresh all attributes.
|
18
26
|
# Retrive data using <tt>@dumper</tt>, load bins, top chunk etc.
|
19
27
|
# @return [HeapInfo::Arena] self
|
20
28
|
def reload!
|
@@ -54,11 +62,14 @@ module HeapInfo
|
|
54
62
|
attr_reader :size_t
|
55
63
|
end
|
56
64
|
|
65
|
+
# Class for record fastbin type chunk.
|
57
66
|
class Fastbin < Chunk
|
67
|
+
# @return [Integer]
|
58
68
|
attr_reader :fd
|
69
|
+
# @return [Integer]
|
59
70
|
attr_accessor :index
|
60
71
|
|
61
|
-
# Instantiate a <tt>HeapInfo::Fastbin</tt> object
|
72
|
+
# Instantiate a <tt>HeapInfo::Fastbin</tt> object.
|
62
73
|
#
|
63
74
|
# @param [Mixed] args See <tt>HeapInfo::Chunk</tt> for more information.
|
64
75
|
def initialize(*args)
|
@@ -66,18 +77,20 @@ module HeapInfo
|
|
66
77
|
@fd = Helper.unpack(size_t, @data[0, @size_t])
|
67
78
|
end
|
68
79
|
|
69
|
-
# Mapping index of fastbin to chunk size
|
80
|
+
# Mapping index of fastbin to chunk size.
|
70
81
|
# @return [Integer] size
|
71
82
|
def idx_to_size
|
72
83
|
index * size_t * 2 + size_t * 4
|
73
84
|
end
|
74
85
|
|
75
|
-
# For pretty inspect
|
76
|
-
# @return [String] Title with color codes
|
86
|
+
# For pretty inspect.
|
87
|
+
# @return [String] Title with color codes.
|
77
88
|
def title
|
78
89
|
"%s%s: " % [Helper.color(Helper.class_name(self), sev: :bin), index.nil? ? nil : "[#{Helper.color("%#x" % idx_to_size)}]"]
|
79
90
|
end
|
80
91
|
|
92
|
+
# Pretty inspect.
|
93
|
+
# @return [String] fastbin layouts wrapper with color codes.
|
81
94
|
def inspect
|
82
95
|
title + list.map do |ptr|
|
83
96
|
next "(#{ptr})\n" if ptr.is_a? Symbol
|
@@ -105,10 +118,14 @@ module HeapInfo
|
|
105
118
|
ret << nil
|
106
119
|
end
|
107
120
|
|
121
|
+
# @param [Integer] ptr Get the <tt>fd</tt> value of chunk at <tt>ptr</tt>.
|
122
|
+
# @return [Integer] The <tt>fd</tt>.
|
108
123
|
def fd_of(ptr)
|
109
124
|
addr_of(ptr, 2)
|
110
125
|
end
|
111
126
|
|
127
|
+
# @param [Integer] ptr Get the <tt>bk</tt> value of chunk at <tt>ptr</tt>.
|
128
|
+
# @return [Integer] The <tt>bk</tt>.
|
112
129
|
def bk_of(ptr)
|
113
130
|
addr_of(ptr, 3)
|
114
131
|
end
|
@@ -121,21 +138,30 @@ module HeapInfo
|
|
121
138
|
end
|
122
139
|
end
|
123
140
|
|
141
|
+
# Class for record unsorted bin type chunk.
|
124
142
|
class UnsortedBin < Fastbin
|
143
|
+
# @return [Integer]
|
125
144
|
attr_reader :bk
|
145
|
+
|
146
|
+
# Instantiate a <tt>HeapInfo::UnsortedBin</tt> object.
|
147
|
+
#
|
148
|
+
# @param [Mixed] args See <tt>HeapInfo::Chunk</tt> for more information.
|
126
149
|
def initialize(*args)
|
127
150
|
super
|
128
151
|
@bk = Helper.unpack(size_t, @data[@size_t, @size_t])
|
129
152
|
end
|
130
153
|
|
131
|
-
# size
|
132
|
-
#
|
154
|
+
# @option [Integer] size At most expand size. For <tt>size = 2</tt>, the expand list would be <tt>bk, bk, bin, fd, fd</tt>.
|
155
|
+
# @return [String] unsorted bin layouts wrapper with color codes.
|
133
156
|
def inspect(size: 2)
|
134
157
|
list = link_list(size)
|
135
158
|
return '' if list.size <= 1 and Helper.class_name(self) != 'UnsortedBin' # bad..
|
136
159
|
title + pretty_list(list) + "\n"
|
137
160
|
end
|
138
161
|
|
162
|
+
# Wrapper the double-linked list with color codes.
|
163
|
+
# @param [Array<Integer>] list The list from <tt>#link_list</tt>.
|
164
|
+
# @return [String] Wrapper with color codes.
|
139
165
|
def pretty_list(list)
|
140
166
|
center = nil
|
141
167
|
list.map.with_index do |c, idx|
|
@@ -157,6 +183,11 @@ module HeapInfo
|
|
157
183
|
end.join(" === ")
|
158
184
|
end
|
159
185
|
|
186
|
+
# Return the double link list with bin in the center.
|
187
|
+
#
|
188
|
+
# The list will like <tt>[..., bk of bk, bk of bin, bin, fd of bin, fd of fd, ...]</tt>.
|
189
|
+
# @param [Integer] expand_size At most expand size. For <tt>size = 2</tt>, the expand list would be <tt>bk, bk, bin, fd, fd</tt>.
|
190
|
+
# @return [Array<Integer>] The linked list.
|
160
191
|
def link_list(expand_size)
|
161
192
|
list = [@base]
|
162
193
|
# fd
|
@@ -178,9 +209,10 @@ module HeapInfo
|
|
178
209
|
end
|
179
210
|
end
|
180
211
|
|
212
|
+
# Class for record smallbin type chunk.
|
181
213
|
class Smallbin < UnsortedBin
|
182
214
|
|
183
|
-
# Mapping index of smallbin to chunk size
|
215
|
+
# Mapping index of smallbin to chunk size.
|
184
216
|
# @return [Integer] size
|
185
217
|
def idx_to_size
|
186
218
|
index * size_t * 2 + size_t * 18
|
data/lib/heapinfo/chunks.rb
CHANGED
data/lib/heapinfo/ext/string.rb
CHANGED
@@ -3,12 +3,20 @@ module HeapInfo
|
|
3
3
|
module String
|
4
4
|
# Methods to be mixed into String
|
5
5
|
module InstanceMethods
|
6
|
+
# Convert string to a <tt>HeapInfo::Chunk</tt>.
|
7
|
+
# @option [Integer] bits 32 or 64 bit of this chunk.
|
8
|
+
# @option [Integer] base Base address will show when print the <tt>Chunk</tt> object.
|
9
|
+
# @return [HeapInfo::Chunk]
|
6
10
|
def to_chunk(bits: 64, base: 0)
|
7
11
|
size_t = bits / 8
|
8
12
|
dumper = ->(addr, len) { self[addr-base, len] }
|
9
13
|
Chunk.new(size_t, base, dumper)
|
10
14
|
end
|
11
15
|
|
16
|
+
# Convert string to array of <tt>HeapInfo::Chunk</tt>.
|
17
|
+
# @option [Integer] bits 32 or 64 bit of this chunk.
|
18
|
+
# @option [Integer] base Base address will show when print the <tt>Chunk</tt> object.
|
19
|
+
# @return [HeapInfo::Chunks]
|
12
20
|
def to_chunks(bits: 64, base: 0)
|
13
21
|
size_t = bits / 8
|
14
22
|
chunks = Chunks.new
|
data/lib/heapinfo/libc.rb
CHANGED
@@ -1,30 +1,42 @@
|
|
1
1
|
module HeapInfo
|
2
|
+
# Record libc's base, name, and offsets.
|
2
3
|
class Libc < Segment
|
4
|
+
|
5
|
+
# Instantiate a <tt>HeapInfo::Libc</tt> object.
|
6
|
+
#
|
7
|
+
# @param [Mixed] args See <tt>#HeapInfo::Segment.initialize</tt> for more information.
|
3
8
|
def initialize(*args)
|
4
9
|
super
|
5
10
|
@offset = {}
|
6
11
|
end
|
7
12
|
|
13
|
+
# Get the offset of <tt>main_arena</tt> in libc.
|
14
|
+
# @return [Integer]
|
8
15
|
def main_arena_offset
|
9
16
|
return @offset[:main_arena] if @offset[:main_arena]
|
10
17
|
return nil unless exhaust_search :main_arena
|
11
18
|
@offset[:main_arena]
|
12
19
|
end
|
13
20
|
|
21
|
+
# Get the <tt>main_arena</tt> of libc.
|
22
|
+
# @return [HeapInfo::Arena]
|
14
23
|
def main_arena
|
15
24
|
return @main_arena.reload! if @main_arena
|
16
25
|
off = main_arena_offset
|
17
26
|
return if off.nil?
|
18
|
-
@main_arena = Arena.new(off + self.base, process.bits,
|
27
|
+
@main_arena = Arena.new(off + self.base, process.bits, process.method(:dump))
|
19
28
|
end
|
20
29
|
|
30
|
+
# @param [Array] maps See <tt>#HeapInfo::Segment.find</tt> for more information.
|
31
|
+
# @param [String] name See <tt>#HeapInfo::Segment.find</tt> for more information.
|
32
|
+
# @param [HeapInfo::Process] process The process.
|
33
|
+
# @return [HeapInfo::Libc] libc segment found in maps.
|
21
34
|
def self.find(maps, name, process)
|
22
35
|
obj = super(maps, name)
|
23
36
|
obj.send(:process=, process)
|
24
37
|
obj
|
25
38
|
end
|
26
39
|
|
27
|
-
|
28
40
|
private
|
29
41
|
attr_accessor :process
|
30
42
|
# only for searching offset of main_arena now
|
data/lib/heapinfo/process.rb
CHANGED
@@ -162,7 +162,7 @@ module HeapInfo
|
|
162
162
|
end
|
163
163
|
|
164
164
|
def load! # try to load
|
165
|
-
return if @pid
|
165
|
+
return true if @pid
|
166
166
|
@pid = fetch_pid
|
167
167
|
return false if @pid.nil? # still can't load
|
168
168
|
load_info!
|
@@ -186,6 +186,7 @@ module HeapInfo
|
|
186
186
|
end
|
187
187
|
@dumper = Dumper.new(@info, mem_filename)
|
188
188
|
end
|
189
|
+
|
189
190
|
def mem_filename
|
190
191
|
"/proc/#{pid}/mem"
|
191
192
|
end
|
@@ -8,7 +8,16 @@ module HeapInfo
|
|
8
8
|
# e.g. <tt>process.libc alias to process.info.libc</tt>
|
9
9
|
EXPORT = %i(libc ld heap elf program stack bits)
|
10
10
|
|
11
|
-
|
11
|
+
# @return [Integer] 32 or 64.
|
12
|
+
attr_reader :bits
|
13
|
+
# @return [HeapInfo::Segment]
|
14
|
+
attr_reader :program
|
15
|
+
# @return [HeapInfo::Segment]
|
16
|
+
attr_reader :stack
|
17
|
+
# @return [HeapInfo::Libc]
|
18
|
+
attr_reader :libc
|
19
|
+
# @return [HeapInfo::Segment]
|
20
|
+
attr_reader :ld
|
12
21
|
alias :elf :program
|
13
22
|
|
14
23
|
# Instantiate a <tt>ProcessInfo</tt> object
|
data/lib/heapinfo/segment.rb
CHANGED
data/lib/heapinfo/version.rb
CHANGED