tracetool 0.4.2 → 0.5.4
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/tracetool/android/native.rb +1 -7
- data/lib/tracetool/ios.rb +1 -0
- data/lib/tracetool/ios/atos_context.rb +35 -0
- data/lib/tracetool/ios/parser.rb +1 -1
- data/lib/tracetool/ios/scanner.rb +22 -40
- data/lib/tracetool/utils/cli.rb +5 -5
- data/lib/tracetool/utils/pipe.rb +6 -7
- data/lib/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e0743d5a4d5120b011f4e6f564fce88f30d371db0bf0a1dceedd8036dc902d8
|
4
|
+
data.tar.gz: 482da334fdbf304d13f8f5c008fbac931d4d471bf225d5c6c5e2526e346403c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b088f68484f5b281256c49e9d27547e66d7e8410f29e35e60562c0521e2e62b33e6d3e330b9f7b827237729422dea288a105365c799e7413cca73424d34ad68
|
7
|
+
data.tar.gz: fc08022e268e4e4e8e25c4f294bc382ce0f2986d443f0502e68278d0a0adbf2f57d8e4cc30316eb27ac9e210bd33cb0820d01d67b017ea30fbc6b614cc604ad8
|
@@ -105,13 +105,7 @@ module Tracetool
|
|
105
105
|
# path to symbols dir
|
106
106
|
# @return [String] desymbolicated stack trace
|
107
107
|
def process(ctx)
|
108
|
-
|
109
|
-
symbols = if ctx.arch
|
110
|
-
File.join(symbols, ctx.arch)
|
111
|
-
else
|
112
|
-
Dir[File.join(symbols, '*')].first || symbols
|
113
|
-
end
|
114
|
-
Pipe['ndk-stack', '-sym', symbols] << @trace
|
108
|
+
Pipe['ndk-stack', '-sym', ctx.symbols] << @trace
|
115
109
|
end
|
116
110
|
|
117
111
|
# Create parser for current trace format
|
data/lib/tracetool/ios.rb
CHANGED
@@ -0,0 +1,35 @@
|
|
1
|
+
module Tracetool
|
2
|
+
module IOS
|
3
|
+
# Converts context to atos arguments
|
4
|
+
class AtosContext
|
5
|
+
# If no arch specified will use `arm64`
|
6
|
+
DEFAULT_ARCH = 'arm64'.freeze
|
7
|
+
|
8
|
+
# List of required argument names
|
9
|
+
REQUIRED_ARGUMENTS = %i[load_address xarchive module_name].freeze
|
10
|
+
|
11
|
+
def initialize(ctx)
|
12
|
+
check_arguments(ctx)
|
13
|
+
@load_address = ctx.load_address
|
14
|
+
@binary_path = module_binary(ctx.xarchive, ctx.module_name)
|
15
|
+
@arch = ctx.arch || 'arm64'
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_args
|
19
|
+
%w[-o -l -arch].zip([@binary_path, @load_address, @arch]).flatten
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def module_binary(xarchive, module_name)
|
25
|
+
File.join(xarchive, 'dSYMs', "#{module_name}.app.dSYM", 'Contents', 'Resources', 'DWARF', module_name)
|
26
|
+
end
|
27
|
+
|
28
|
+
def check_arguments(ctx)
|
29
|
+
REQUIRED_ARGUMENTS.each do |a|
|
30
|
+
ctx[a] || raise(ArgumentError, "Missing `#{a}` value")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/tracetool/ios/parser.rb
CHANGED
@@ -5,7 +5,7 @@ module Tracetool
|
|
5
5
|
# IOS traces scanner and source mapper
|
6
6
|
class IOSTraceParser < Tracetool::BaseTraceParser
|
7
7
|
# Describes IOS stack entry
|
8
|
-
STACK_ENTRY_PATTERN = /^(?<frame>\d+)
|
8
|
+
STACK_ENTRY_PATTERN = /^(?<frame>\d+)\t(?<binary>.+)\t(?<call_description>.+)$/.freeze
|
9
9
|
# Describes source block
|
10
10
|
SOURCE_PATTERN =
|
11
11
|
/^((-?\[(?<class>[^ ]+) (?<method>.+)\])|(?<method>.+)) \(in (?<module>.+)\) \((?<file>.+):(?<line>\d+)\)$/
|
@@ -1,37 +1,5 @@
|
|
1
1
|
module Tracetool
|
2
2
|
module IOS
|
3
|
-
# Converts context to atos arguments
|
4
|
-
class AtosContext
|
5
|
-
# If no arch specified will use `arm64`
|
6
|
-
DEFAULT_ARCH = 'arm64'.freeze
|
7
|
-
|
8
|
-
# List of required argument names
|
9
|
-
REQUIRED_ARGUMENTS = %i[load_address xarchive module_name].freeze
|
10
|
-
|
11
|
-
def initialize(ctx)
|
12
|
-
check_arguments(ctx)
|
13
|
-
@load_address = ctx.load_address
|
14
|
-
@binary_path = module_binary(ctx.xarchive, ctx.module_name)
|
15
|
-
@arch = ctx.arch || 'arm64'
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_args
|
19
|
-
%w[-o -l -arch].zip([@binary_path, @load_address, @arch]).flatten
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def module_binary(xarchive, module_name)
|
25
|
-
File.join(xarchive, 'dSYMs', "#{module_name}.app.dSYM", 'Contents', 'Resources', 'DWARF', module_name)
|
26
|
-
end
|
27
|
-
|
28
|
-
def check_arguments(ctx)
|
29
|
-
REQUIRED_ARGUMENTS.each do |a|
|
30
|
-
ctx[a] || raise(ArgumentError, "Missing `#{a}` value")
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
3
|
# launches atos
|
36
4
|
class IOSTraceScanner
|
37
5
|
# Stack trace line consists of numerous whitespace separated
|
@@ -44,13 +12,32 @@ module Tracetool
|
|
44
12
|
# @return [Array] containing (%binary_name%, %address%) pairs
|
45
13
|
def parse(trace)
|
46
14
|
trace.split("\n").map do |line|
|
47
|
-
line
|
15
|
+
parse_line(line)
|
48
16
|
end
|
49
17
|
end
|
50
18
|
|
19
|
+
# Parse trace line from trace. Which usualy looks like this:
|
20
|
+
# 3 My Module Name 0x0000000102d6e9f4 My Module Name + 5859828
|
21
|
+
# We need to fetch two values: 'My Module Name' and '0x0000000102d6e9f4'.
|
22
|
+
def parse_line(line)
|
23
|
+
parts = line.split(' ')
|
24
|
+
parts.shift # Frame number, not needed
|
25
|
+
|
26
|
+
module_name = ''
|
27
|
+
|
28
|
+
until parts.first.start_with?('0x')
|
29
|
+
module_name += parts.shift
|
30
|
+
module_name += ' '
|
31
|
+
end
|
32
|
+
|
33
|
+
address = parts.shift
|
34
|
+
|
35
|
+
[module_name.chop, address]
|
36
|
+
end
|
37
|
+
|
51
38
|
def process(trace, context)
|
52
39
|
trace = parse(trace)
|
53
|
-
desym = run_atos(context, trace.map(&:last))
|
40
|
+
desym = run_atos(context, trace.map(&:last).join(' '))
|
54
41
|
# Add useful columns to unpacked trace
|
55
42
|
mix(trace, desym.split("\n")).join("\n")
|
56
43
|
end
|
@@ -72,12 +59,7 @@ module Tracetool
|
|
72
59
|
def mix(trace, symbolicated)
|
73
60
|
trace.zip(symbolicated).map.with_index do |pair, i|
|
74
61
|
t, desym = pair
|
75
|
-
|
76
|
-
line << i
|
77
|
-
line << t.first
|
78
|
-
line << desym
|
79
|
-
|
80
|
-
line.join(' ')
|
62
|
+
"#{i}\t#{t.first}\t#{desym}"
|
81
63
|
end
|
82
64
|
end
|
83
65
|
end
|
data/lib/tracetool/utils/cli.rb
CHANGED
@@ -6,8 +6,8 @@ require_relative '../../version'
|
|
6
6
|
module Tracetool
|
7
7
|
# Tracetool cli args parser
|
8
8
|
class ParseArgs
|
9
|
-
# List of supported abis
|
10
|
-
ARCH_LIST = %i[
|
9
|
+
# List of supported abis. Only needed for iOS unpacking
|
10
|
+
ARCH_LIST = %i[arm arm64].freeze
|
11
11
|
#
|
12
12
|
# Return a structure describing the options.
|
13
13
|
#
|
@@ -30,14 +30,14 @@ module Tracetool
|
|
30
30
|
|
31
31
|
{
|
32
32
|
'address' => options.address,
|
33
|
-
'module' => options.modulename
|
33
|
+
'module' => options.modulename,
|
34
|
+
'arch' => options.arch
|
34
35
|
}.each { |arg, check| raise(OptionParser::MissingArgument, arg) unless check }
|
35
36
|
end
|
36
37
|
|
37
38
|
def self.check(options)
|
38
39
|
{
|
39
|
-
'platform' => options.platform
|
40
|
-
'arch' => options.arch
|
40
|
+
'platform' => options.platform
|
41
41
|
}.each { |arg, check| raise(OptionParser::MissingArgument, arg) unless check }
|
42
42
|
end
|
43
43
|
|
data/lib/tracetool/utils/pipe.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'open3'
|
2
|
+
|
2
3
|
module Tracetool
|
3
|
-
#
|
4
|
+
# Helper module for launching commands
|
4
5
|
module Pipe
|
5
6
|
# Executes shell command
|
6
7
|
class Executor
|
@@ -14,12 +15,10 @@ module Tracetool
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def <<(args)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
io.read.chomp
|
22
|
-
end
|
18
|
+
out, err, status = Open3.capture3({}, *cmd, stdin_data: args)
|
19
|
+
raise "#{cmd.join(' ')} (exit: #{status.exitstatus}) #{err.chomp}" unless status.success?
|
20
|
+
|
21
|
+
out.chomp
|
23
22
|
end
|
24
23
|
end
|
25
24
|
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tracetool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4
|
4
|
+
version: 0.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ilya.arkhanhelsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: powerpack
|
@@ -37,6 +37,7 @@ files:
|
|
37
37
|
- lib/tracetool/android/java.rb
|
38
38
|
- lib/tracetool/android/native.rb
|
39
39
|
- lib/tracetool/ios.rb
|
40
|
+
- lib/tracetool/ios/atos_context.rb
|
40
41
|
- lib/tracetool/ios/parser.rb
|
41
42
|
- lib/tracetool/ios/scanner.rb
|
42
43
|
- lib/tracetool/utils/cli.rb
|
@@ -65,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
66
|
- !ruby/object:Gem::Version
|
66
67
|
version: '0'
|
67
68
|
requirements: []
|
68
|
-
rubygems_version: 3.
|
69
|
+
rubygems_version: 3.1.2
|
69
70
|
signing_key:
|
70
71
|
specification_version: 4
|
71
72
|
summary: Tracetool
|