Я написал это в среде Rails . Это всего лишь пять строк JavaScript, если вы используете легкий плагин jQuery-формы.
Задача заключается в том, что загрузка AJAX работает, поскольку стандарт remote_form_for
не понимает представления нескольких частей. Он не собирается отправлять данные файла. Rails ищет запрос AJAX.
Именно здесь вступает в игру плагин jQuery-form.
Вот код Rails для него:
<% remote_form_for(:image_form,
:url => { :controller => "blogs", :action => :create_asset },
:html => { :method => :post,
:id => 'uploadForm', :multipart => true })
do |f| %>
Upload a file: <%= f.file_field :uploaded_data %>
<% end %>
Вот соответствующий JavaScript:
$('#uploadForm input').change(function(){
$(this).parent().ajaxSubmit({
beforeSubmit: function(a,f,o) {
o.dataType = 'json';
},
complete: function(XMLHttpRequest, textStatus) {
// XMLHttpRequest.responseText will contain the URL of the uploaded image.
// Put it in an image element you create, or do with it what you will.
// For example, if you have an image elemtn with id "my_image", then
// $('#my_image').attr('src', XMLHttpRequest.responseText);
// Will set that image tag to display the uploaded image.
},
});
});
И вот действие контроллера Rails, довольно ваниль:
@image = Image.new(params[:image_form])
@image.save
render :text => @image.public_filename
Я использовал это в течение последних нескольких недель с Bloggity, и он работал как чемпион.
Вы должны вычислить адрес для использования с atos, вы не можете просто использовать его в стеке.
symbol address = slide + stack address - load address
slide
- это значение vmaddr
в LC_SEGMENT cmd
(В основном это 0x1000
). Для этого запустите следующее: otool -arch ARCHITECTURE -l "APP_BUNDLE/APP_EXECUTABLE" | grep -B 3 -A 8 -m 2 "__TEXT"
Замените ARCHITECTURE
на фактическую архитектуру, отображаемую в отчете о сбое, например. armv7
. Замените APP_BUNDLE/APP_EXECUTABLE
на путь к фактическому исполняемому файлу. stack address
- это шестнадцатеричное значение из отчета о сбое. load address
может быть первым адресом, отображающим в секции Binary Images
в самой передней части строки, содержащей ваш исполняемый файл. (Обычно первая запись). Так как в прошлом значение slide
было равно значению load address
, это всегда срабатывало. Но поскольку Apple представила рандомизацию расположения пространства адреса , начиная с iOS 4.3 (в разных вариантах), адрес загрузки приложений рандомизирован по соображениям безопасности.
Простейшая альтернатива: вы можете использовать флаг atos -l
, чтобы сделать это для математики для вас.
Предположим, что в вашем журнале сбоев вы указали следующую строку:
5 MyApp 0x0044e89a 0x29000 + 4348058
Первый шестнадцатеричный номер - это адрес стека, а второй шестнадцатеричный номер - адрес загрузки. Вы можете игнорировать последний номер. Вам также не нужно беспокоиться о слайд-адресах.
Чтобы символизировать, выполните следующие действия:
atos -o MyApp.app/MyApp -arch armv7 -l 0x29000 0x0044e89a
Если вы не можете найти файл MyApp.app/MyApp, переименуйте файл «.ipa» в «.zip», разархивируйте его, и он будет в папке «Полезная нагрузка».
И если вы не знаете, какую архитектуру использовать (например, armv7 или armv7s), выделите часть «Двоичные изображения» в файле сбоя, и вы можете найти его там.
Приветствия
Просто используйте dwarfdump:
dwarfdump --arch armv7 myApp.dSYM --lookup 0xaabbccdd | grep 'Line table'
Не нужно вообще делать какие-либо вычисления.
(Из Получить символ по адресу (символизирующий двоичную, iOS-сборку) ).
Для кого это определенное время не имеет значения для Load Address следующим образом:
Jan 14 11:02:39 Dennins-iPhone AppName[584] <Critical>: Stack Trace: (
0 CoreFoundation 0x2c3084b7 <redacted> + 150
1 libobjc.A.dylib 0x39abec8b objc_exception_throw + 38
2 CoreFoundation 0x2c21cc35 CFRunLoopRemoveTimer + 0
3 AppName 0x0005a7db AppName + 272347
Я создал простой bash, чтобы помочь мне отлаживать:
#! /bin/bash
read -p "[Path] [App Name] [Stack Address] [DecimalSum] " path appName stackAddress decimalSum
loadAddress=`echo "obase=16;ibase=10;$((stackAddress-decimalSum))" | bc`
atos -o $path/Payload/$appName.app/$appName -l $loadAddress $stackAddress -arch armv7
Он просто читает путь для приложения, имя приложения, адрес стека и значение после сигнала «+» (десятичное значение), а затем найдите значение для адреса загрузки для запуска команды atos.