Skip to content

Instantly share code, notes, and snippets.

@AlexKalinin
Created January 27, 2017 12:38
Show Gist options
  • Save AlexKalinin/5d61d6294492b84e8ba9fb3e41c008f4 to your computer and use it in GitHub Desktop.
Save AlexKalinin/5d61d6294492b84e8ba9fb3e41c008f4 to your computer and use it in GitHub Desktop.
This script helps to decode stacktrace places of concatenated and compiled JS file Raw
class CompiledJsBacktracer
def initialize(trace_arr, path, original_filename, ancor = '/*UNIQ_ANCOR_D6791*/', context_lines = 200)
@trace = trace_arr
@path = path
@original_fname = original_filename
@ancor = ancor
@context_lines = context_lines
end
def process
raise 'Please install first js-beautify: `npm install -g js-beautify`' unless js_beautify_installed?
brakepoints.each_with_index do |br, idx|
line, pos = br
new_file_name = "compiled_#{'%03d' % idx}__#{line}_#{pos}.js"
new_file_path = File.join @path, new_file_name
puts "Processing #{new_file_path}"
FileUtils.cp File.join(@path, @original_fname), new_file_path
insert_ancor_to_file(new_file_path, line, pos)
beautified_name = 'de' + new_file_name
beautified_path = File.join(@path, beautified_name)
beautify new_file_path, beautified_path
parted_name = 'part_of_' + beautified_name
parted_path = File.join(@path, parted_name)
extract_part beautified_path, parted_path
end
puts "Ancor was: #{@ancor}"
end
private
# array with arrays:
# first - linenumber
# second - position in string
def brakepoints
@trace.map{|e| e.sub(/^.*js:/, '').split(':')}
end
def beautify(input, output)
`js-beautify -f #{input} -o #{output}`
end
def js_beautify_installed?
`which js-beautify`.present?
end
def insert_ancor_to_file(file_path, line, position)
Tempfile.open(".#{File.basename(file_path)}", File.dirname(file_path)) do |tempfile|
File.open(file_path).each_with_index do |line_text, line_idx|
if line_idx == (line.to_i - 1)
tempfile.puts line_text.insert(position.to_i - 1, @ancor)
else
tempfile.puts line_text
end
end
tempfile.fdatasync
tempfile.close
FileUtils.mv tempfile.path, file_path
end
end
def extract_part(input, output)
ancor_position = get_line_number(input)
File.open(input, 'r') do |input_file|
File.open(output, 'w') do |output_file|
file_num = 0
input_file.each_line do |line|
file_num += 1
output_file.puts line if file_num > ancor_position - @context_lines / 2
break if file_num > ancor_position + @context_lines / 2
end
output_file.fdatasync
output_file.close
end
end
end
def get_line_number(file)
count = 0
file = File.open(file, "r") do |file|
file.each_line do |line|
count += 1
return count if line.include? @ancor
end
end
end
end
arr = [
"e@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:2210",
"a@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:3398",
"l@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:3449",
"l<.instantiateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:29035",
"y.Mixin._reconcilerInstantiateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16103",
"y.Mixin.mountChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16264",
"g.Mixin._createContentMarkup@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2357",
"g.Mixin.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:1310",
"r.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15484",
"y.Mixin.mountChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16418",
"g.Mixin._createContentMarkup@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2357",
"g.Mixin.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:1310",
"r.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15484",
"y.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:6523",
"r.mountComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15484",
"y.Mixin._mountChildByNameAtIndex@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17984",
"y.Mixin._updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17365",
"y.Mixin.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16964",
"g.Mixin._updateDOMChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:5190",
"g.Mixin.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:3413",
"g.Mixin.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2833",
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827",
"y._updateRenderedComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9605",
"y._performComponentUpdate@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9361",
"y.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:8635",
"y.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:7918",
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827",
"l<.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:29208",
"y.Mixin._reconcilerUpdateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16199",
"y.Mixin._updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17091",
"y.Mixin.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16964",
"g.Mixin._updateDOMChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:5190",
"g.Mixin.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:3413",
"g.Mixin.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2833",
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827",
"l<.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:29208",
"y.Mixin._reconcilerUpdateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16199",
"y.Mixin._updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:17091",
"y.Mixin.updateChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:16964",
"g.Mixin._updateDOMChildren@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:5190",
"g.Mixin.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:3413",
"g.Mixin.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:333:2833",
"r.receiveComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15827",
"y._updateRenderedComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9605",
"y._performComponentUpdate@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:9361",
"y.updateComponent@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:8635",
"y.performUpdateIfNecessary@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:332:8162",
"r.performUpdateIfNecessary@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:15983",
"a@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:11056",
"o.perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29018",
"o.perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29018",
".perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:12038",
"k@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:12221",
"o.closeAll@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29653",
"o.perform@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:29098",
"d.batchedUpdates@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:28510",
"l@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:11256",
"i@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:31274",
"u<.enqueueSetState@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:330:32139",
"i.prototype.setState@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:331:24831",
"CustomizableTable</<.value/this._itemsRequest<.success@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:571:29006",
"ft.Callbacks/c@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:25:23627",
"ft.Callbacks/u.fireWith@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:25:24421",
"i@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:26:28170",
".send/n/<@https://company.com/assets/application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js:27:311"
]
path = '/Users/alexkalinin/prj/company.com/report-gist2/20170126_airbrake/'
orig_file_name = 'application-a6a018f5eb0fe518daab13c248cd68bcbcce46aaed0dcaff848a54ccb40f11bd.js'
CompiledJsBacktracer.new(arr, path, orig_file_name).process
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment