1 / 12

Министерство образования Российской Федерации Московский Физико-Технический Институт (ГУ)

Министерство образования Российской Федерации Московский Физико-Технический Институт (ГУ) Разработка средства анализа трассы исполнения двоично-транслированной программы в терминах промежуточного представления компиляции. Квалификационная бакалаврская работа студента 112 группы

ita
Download Presentation

Министерство образования Российской Федерации Московский Физико-Технический Институт (ГУ)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Министерство образования Российской Федерации Московский Физико-Технический Институт (ГУ) Разработка средства анализа трассы исполнения двоично-транслированной программы в терминах промежуточного представления компиляции. Квалификационная бакалаврская работа студента 112 группы Факультета Радиотехники и Кибернетики Загребина Андрея Александровича Научный руководитель: Старший научный сотрудник Масленников Дмитрий Михайлович Москва, 2005

  2. Описание проблемы отладки двоичного оптимизирующего компилятора: Intel x86 код – код Эльбрус 2000 Процесс отладки: Интерпретатор Архитектуры Эльбрус 2000 Intel x86 код Исполняемый код Эльбрус 2000 Двоичный оптимизи- рующий компилятор Исполнение Сильное различие ! Dump-файл Информация о компиляции Промежуточное представление Trace-файл Трасса исполнения Информация о выполненных командах Ошибки исполнения Нехватка информации о компиляции Необходимость сопоставления информации вручную ! Ошибки восстановления x86 контекста Выявление Причин Ошибок Исправление ошибок В связи с возникшей задачей было поставлено следующее техническое задание.

  3. Техническое задание. • Выявить основные различия между представлением семантики в трассе результирующего • исполняемого кода микропроцессора VLIW-архитектуры Эльбрус 2000 • и промежуточным представлением двоичного оптимизирующего компилятора: • Intel x86 код – код Эльбрус 2000, а также важную с точки зрения анализа разработчиком при • отладке результирующего кода информацию из промежуточного представления компилятора, • которая отсутствует в трассе исполнения. 2. По результатам анализа из предыдущего пункта разработать средство отладки двоичного компилятора Intel x86 -> Эльбрус 2000, позволяющего представить результат исполнения откомпилированной программы (трассу) в терминах промежуточного представления компилятора. • Разрабатываемое средство должно представлять из себя программу, запускаемую • из командной строки в операционной системе Linux. 4. Программа должна обрабатывать трассу исполнения кода, полученного после компиляции любого кода платформы Intel x86, на интерпретаторах микропроцессора Эльбрус 2000 в том числе в режиме моделирования прерываний для тестирования механизма восстановления x86 контекста.

  4. Оптимизирующий двоичный компилятор. Intel x86 код, информация о регионах, профильная информация начальная (front end) Синтаксический Семантический разбор Фазы анализа промежуточного представления … Фаза анализа управления … Фазы оптимизаций … Генер. кода опт. Код E2K первичная генерация и частичная оптимизация Граф потокауправления Control Flow Graph (CFG) Промежуточное Представление (IR) Аналитические Структуры данных … Операционная семантика … Узлы CFG (Линейные участкикода) Enter Op 1, Op2 … переход … Абстрактные ОПЕРАЦИИ компилятора Enter Op 1 Op2 … переход Enter Op 1, Op2 … переход x86 адрес соответствующей x86 операции Номер операции … Аргументы операции Enter Op 1, Op2 … переход Имя операции Обратная дуга Цикл …

  5. Понятия контрольной точки и контекста. • Обработка любого возникшего прерывания без его потери!!! • Последующее восстановление x86 контекста!!! Восстанавливаемый Невосстанавливаемый В компиляторе: (интеловская память) ……………………………… T=7 <0002f8> 5 1258. STDSB <921> … [P1](X86Addr: 0x80481f1) ……………………………… T=7 <0002f8> 0 921. SRP <1258> ... [P1] (X86Addr: 0x80481f4) cc_addr=<0x96a8> ……………………………… Прерывание обработка Компенсирующий код (восстанавливает x86 контекст) поставить контрольную точку В трассе (для архитектуры Эльбрус 2000): SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) … В регистре RPR хранится адрес компенсирующего кода Для проверки механизма восстановления x86 контекста создан специальный вид интерпретатора lsim_trap, который сам генерирует псевдо - прерывания.

  6. Dump-файл Дизассемблер Эльбрус 2000 Содержит список операций промежуточного представления информацию компиляции о них и их планирование по тактам: 0000<0xa880> HS 0000c012 804834d_1_region: CS0 4000000c disp %ctpr1, M_a8e0 CS1 0c5fcfe0 setwd wsz = 0x60, nfx = 0x0 setbn rsz = 0x3f, rbs = 0x20, rcur = 0x3c setbp psz = 0x17 LTS0 00000c00 ……………………………… // ТЕЛО 0007<0xa8b8> HS 9c041023 : SS 80000440 ct %ctpr1 ? %pred3 ipd 2 ALS0 10c0e09a adds,3 0, %g0, %r26 ALS1 0016d014 ands,2 %b[22], _f16,_lts0lo 0xff, %b[20] ALS2 2ec0d8af stdsw,2 %r47, [ _f32,_lts0 0x804a074 ] ALS5 2cc0d808 stdsb,2 %b[8], [ _f32,_lts0 0x804a016 ] PLS0 61622260 pass %pred1, @p0 pass %pred2, @p1 andp ~@p0, ~@p1, @p4 pass @p4, %pred0 Scheduled IRE2K of … T=0 <000000> 0 1. ENTER (X86Addr:0x804834d) T=0 <000000> 1 605. SETWD 0x6000000 (X86Addr: 0x0000000) T=0 <000000> 1 606. SETBN 0x1778fe0 (X86Addr: 0x0000000) T=0 <000000> 0 943. CTPD <two> 6.-> C0 (X86Addr: 0x0000000) T=0 <000000> 1 607. SETBP 0x1778fe0 (X86Addr: 0x0000000) ……………………………… // ТЕЛО T=7 <0001e8> 0 627. MOVs Gs0 -> Rs26 (X86Addr: 0x8048153) T=7 <0002f8> 5 1258. STDSB <921> …(X86Addr: 0x80481f1) T=7 <0002f8> 0 921. SRP <1258> ... (X86Addr: 0x80481f4) T=7 <0002f8> 2 1175. STDSW <1177> … (X86Addr: 0x80481e7) T=7 <0002f8> 0 1177. SRP <1175> ... (X86Addr: 0x80481ea) T=7 <000200> 1 690. ANDs Bs3 0xff -> Bs2 (X86Addr: 0x8048161) T=7 <000260> 0 681. CLPAND BP1[F] BP2[F]->BP0[T](X86..:0x0.) T=7 <000038> 0 614. BRANCH.c C0 BP3[T](X86Addr:0x0000000) T=7 <000038> 0 590. END (X86Addr: 0x0000000) Oper2CodeInfo … T=0 U=0 1. ENTER addr=<0xa880> - Node 1 (loop 0) T=0 U=1 605. SETWD - s T=0 U=1 606. SETBN - s T=0 U=0 943. CTPD - s T=0 U=1 607. SETBP - s ……………………………… // ТЕЛО T=7 U=5 1258. STDSB addr=<0xa8b8>- s T=7 U=2 1175. STDSW - s T=7 U=0 627. MOVs - s T=7 U=1 690. ANDs - s T=7 U=2 1177. SRP cc_addr=<0x8cf8> s T=7 U=5 921. SRP cc_addr=<0x96a8> s T=7 U=0 681. CLPAND - s T=7 U=0 614. BRANCH - s T=7 U=0 590. END - s Trace-файл ***** 0xa8b8.8353 ***** HS 0 9c041023 :CT %ctpr1(0xa880)t.p.%bp3<%P3>(1) SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) … ALS0 0 10c0e09a ADDs(0), %g0<..> (0x..)->%r26<..>.. ALS1 0 0016d014 ANDs%br22<..>(0x..),(0x..)->%br20… ALS2 0 2ec0d8af STDSW %r47<%R57> (0x23f) -> .. ALS5 0 2c0d808 STDSB %br8<%R74> (0x57) -> .. PLS0 0 61622260 PASS %bp1<%P1> (0) -> @p0 (0) PASS %bp2<%P2> (1) -> @p1 (1) CLPAND ~@p0, ~@p1 -> @p4 %bp0<%P0> (0) ***** 0xa880.8354 ***** HS 0 0000c012 : CS0 0 4000000c BRANCH %ctpr1 (0xa8e0) CS1 0 0c5fcfe0 SETR0 setbp(1) setbn(1) settr(0) .. LTS0 0 00000c00 type(0) rpsz(0) wsz(0x60) nfx(0) x(0) ……………………………… // ТЕЛО

  7. Анализ различий промежуточного представлениякомпиляции и трассы исполнения (dump- и trace-файлов). В результате проведённого анализа были обнаружены следующие отличия. В трассе исполнения не хватает следующей информации о компиляции в терминах IR кода: • Номеров операций в широких командах. • Номеров узлов, в которых находятся широкие команды, • встречаемые в трассе. • (его имеет смысл ставить у команды только, • если предыдущая команда находится в другом узле) • У операций ненулевого x86 адреса • (т.е. если операция не добавлена искусственно компилятором) • соответствующих им операций Intel x86 архитектуры. • Номера одной или двух операций SRP в широкой команде • Номера операции, с которой связанна стоит данная SRP • Адресов компенсирующих кодов, • соответствующих исполнившимся операциям SRP А также информации, которую разработчику приходится находить вручную: • Число итераций цикла • Направление перехода в управляющем графе, • т.е. номер узла, в который осуществляется переход • Флага исполнения конкретной операции SRP • (в трассе есть только флаг исполнения одной из операций SRP) • Признака начала исполнения компенсирующего кода последней SRP

  8. Реализация Средства dtlink. Исполняемый код Эльбрус 2000 Программа написана на языке С и запускается с командной строки операционной системы Linux. Двоичный оптимизи- рующий компилятор Исполнение • Разработанное средство • производит следующие • действия: • Разбирает выдачу компилятора • Собирает информацию • о компиляции • Разбирает трассу • исполнения кода • Получает отсутствующую • в трассе информацию • об исполнении • Вставляет в новую трассу • - старую трассу • - всю собранную информацию • Выдаёт новую трассу Сильное различие ! Trace-файл Трасса исполнения Информация о выполненных командах Dump-файл Информация о компиляции Промежуточное представление Разработанное Средство dtlink Новый Trace-файл Трасса исполнения Информация о выполненных командах в терминах компилятора и исполнения Выявление Причин Ошибок

  9. Результат работы средства dtlink. Модифицированный trace-файл. ***** 0xa8b8.8353 ***** [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr: 0x8cf8 ) ] [ 921. SRP <1258> (1) (x86addr: 0x80481f4 ) (cc_addr: 0x96a8) ] HS 0 9c041023614.:CT %ctpr1(0xa880)tak.pred.%bp3<%P3>(1) Node 1 [0x0000000] SS 0 80000440 ipd(2) eap(0) bap(0) srp(1) vfdi(0) … ALS0 0 10c0e09a 627. ADDs (0), %g0<%G0> (0x..) -> %r26<%R36> (0x..)[0x8048153] ALS1 0 0016d014 690. ANDs %br22<%R88> (0x..), (0x..) -> %br20<%R86>(0x..)[0x8048161] ALS2 0 2ec0d8af 1175. STDSW %r47<%R57> (0x23f) -> DS(..) [..] [0x80481e7] ALS5 0 2cc0d808 1258. STDSB %br8<%R74> (0x57) -> DS(..) [..] [0x80481f1] PLS0 0 61622260 681. PASS %bp1<%P1> (0) -> @p0 (0) [0x0000000] PASS %bp2<%P2> (1) -> @p1 (1) CLPAND ~@p0, ~@p1 -> @p4 %bp0<%P0> (0) ***** 0xa880.8354 ***** Node 1. 5 (1. Enter 0x804834d) HS 0 0000c012 : CS0 0 4000000c 943. BRANCH %ctpr1 (0xa8e0)[0x0000000] CS1 0 0c5fcfe0 605. SETR0 setbp(1) setbn(1) settr(0) .. [0x0000000] LTS0 0 00000c00 type(0) rpsz(0) wsz(0x60) nfx(0) x(0) ……………………………… // ТЕЛО //Прерывание !!! ………………………………//Вызов компенсирующего кода Enter in COMP CODE of [ 921. SRP <1258> (x86addr: 0x80481f4) (cc_addr: 0x96a8) ] ***** 0x96a8.9541641 *****……………………….. • При сравнении • трассы откомпилированного кода • итрассы эталонного кода • Сразу видно: • - Отличие числа итераций • неправдоподобно большое • число итераций Ошибки связанные с циклами неправильное построение условия выхода получение неправильного условия выхода в процессе итерации

  10. Пример 1 на падение интерпретатора lsim из-за ошибки преобразования операций. Неправильная трасса кода полученного отлаживаемым компилятором Intel x86 code: 804852a: andw $0xff00,0x804a05a 8048533: subw $0x300, 0x804a05a 804853c: cmpw $0x3a00,0x804a05a 8048545: jle 8048578 ***** 0xe738.21718 ***** Node 7.0 27. !ANDs %br3<%R197>(0x..),(0x..)->%br5<%R199>(0x..)[0x804852a] ………………………………………………………………………………… ***** 0xe748.21719 ***** 31. !SUBs %br5<%R199>(0x..),(0x..)->%br3<%R197>(0x..)[0x8048533] ………………………………………………………………………………… ***** 0xe758.21720 ***** 115.!CMPLEs %br3<%R197>(0x..), (0x...)->%bp1<%P1>(0)[0x0000000] ………………………………………………………………………………… ***** 0xe758.21720 ***** 11.:CT %ctpr1 (0xe820) tak.pred. ~%bp1<%P1>(0) Node 3 [0x8048545] ………………………………………………… ***** 0xe820. 21727 ***** Node 3.0 ………………………………………………………………………………… 264. UDIVX %dr29<%R39> (0x..), (0x..) -> %br66<%R132> [0x8048578] ………………………………………………………………………………… exc_div: ( division by 0 or the quotient is too large ). После c2do во фрагменте 804851c: • 25. LDDSH 0 .. -> Vs76 (X86Addr: 0x804852a) • 27. ANDs Vs76 .. -> Vs78 (X86Addr: 0x804852a) • 31. SUBs Vs78 .. -> Vs81 (X86Addr: 0x8048533) • 115. CMPLEs Vs81 .. -> P1 [T](X86Addr: 0x0000000) • .. • BRANCH.c C0 BP1[F] (X86Addr:0x8048545) • .. • 264. UDIVX Vs141 .. -> Vs56> (X86Addr:0x8048578) • .. переход Формат 32 бита ! Правильная трасса кода полученного эталонным компилятором До c2do во фрагменте 804851c: ***** 0xf5d8.25755 ***** 27. ANDs %br8<%R74>(0x..),(0x..)->%br5<%R1>(0x..)[0x804852a] ………………………………………………………………………………… ***** 0xf600.25757 ***** 31.SUBs %br7<%R3>(0x..),(0x..)->%br10<%R76>(0x..)[0x8048533] ………………………………………………………………………………… ***** 0xf628.25759 ***** 34.SUBs FLH %br6<%R2>(0x..), (0x..)->%br6<%R2>(0x..)[0x804853c] ………………………………………………………………………… ***** 0xf638.25760 ***** 35.CCTOLP CCTOPLE(0),%br6<%R2>(0x..)->%bp1<%P1>(1)[0x8048545] ………………………………………………………………………………… 27. ANDs Vs76 .. -> Vs78 (X86Addr: 0x804852a) ... 29. ANDs Vs78 .. -> Vs79 (X86Addr: 0x8048533) 31. SUBs Vs79 .. -> Vs81 (X86Addr: 0x8048533) ... 33. ANDs Vs81 .. -> Vs82 (X86Addr: 0x804853c) 34. SUBfh Vs82 .. -> Vs83 (X86Addr: 0x804853c) 35. PLEs Vs83 -> P1 [T](X86Addr: 0x8048545) провал Формат 16 бит !

  11. Пример 2 на не сличение контекста (lsim_trap) и перестановку местами контрольных точек Неправильная трасса кода полученного отлаживаемым компилятором Ошибка восстановления контекста: ! context is damaged at 30048(0x7560), eip: 0x80481f4, srp_prev: 0x87b9 srp_curr: 0x87b9 ! edx(g13): prev 0x8040224 curr 0x8030e7a ***** 0x87b8.9540931 ***** [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr:0x8cf8) ] \\ SRP 1 [ 921. SRP <1258> (1) (x86addr: 0x80481f4) (cc_addr: 0x96a8) ] \\ SRP 2 HS 0 d0001024 : SS 0 0c000000 1177. ipd(0) eap(0) bap(0) srp(1) vfdi(1) … ALS2 0 3e93d0981175. STSSW %r24<%R208> (1) -> SS(…) […] [0x80481e7] ALS4 0 5cc01411 1154. MOVFI %xbr20<%R36> (…) -> %br17<%R33> (0x..) ALS5 0 2fa99e11 1258. STDSD %dbr17<%R33> (0) -> DS(…) […] [0x80481f1] Псевдо прерывание ………………….. ………………….. Enter in COMP CODE of [921.SRP<1258>(x86addr: 0x80481f4)(cc_addr: 0x96a8)] ***** 0x96a8.9541641 ***** ………………….. ………………….. ***** 0x2b5b0.9542901 ***** HS 0 04100011 : ALS0 0 6780c0e0 LDGDD GD(…) […] -> %dg13<%G13> (0x8030e7a) ………………….. ………………….. LSIM_TRAP: ОШИБКА!!! До планирования: 1258. STDSD <921> .. (X86Addr: 0x..) 921. SRP <1258> .. (X86Addr: 0x..) 1175. STSSW <1177> .. (X86Addr: 0x..) 1177. SRP <1175> .. (X86Addr: 0x..) После планирования: 5 1258. STDSD <921> ..(X86Addr: 0x..) 0 921. SRP <1258>..(X86Addr: 0x..) 2 1175. STSSW <1177>..(X86Addr: 0x..) 0 1177. SRP <1175>..(X86Addr: 0x..) Правильная трасса кода полученного эталонным компилятором ***** 0x87b8.9540931 ***** [ 921. SRP <1258> (1) (x86addr: 0x80481f4) (cc_addr: 0x96a8) ] \\ SRP 2 [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr:0x8cf8) ] \\ SRP 1 HS 0 d0001024 : SS 0 0c000000 1177. ipd(0) eap(0) bap(0) srp(1) vfdi(1) abg(0) …. ALS2 0 2fa99e11 1258. STDSD %dbr17<%R33> (0) -> DS(…) […] [0x80481f1] ALS4 0 5cc01411 1154. MOVFI %xbr20<%R36> (…) -> %br17<%R33> (0x..) ALS5 0 3e93d098 1175. STSSW %r24<%R208> (1) -> SS(…) […] [0x80481e7] Enter in COMP CODE of [ 1177. SRP <1175> (1) (x86addr: 0x80481ea) (cc_addr:0x8cf8) ] ***** 0x8cf8.9541529 ***** …………………………………………………………………………………………………….. ***** 0x2b600.9542906 ***** HS 0 04100011 : ALS0 0 6780c0e0 LDGDD GD(…) […] -> %dg13<%G13> (0x8040224) И окончательно (по шир. командам): 2 1175. STSSW addr=<0x87b8> s 2 1177. SRPcc_addr=<0x8cf8> s 5 1258. STDSD - s 5 921. SRP cc_addr=<0x96a8> s

  12. Результаты поведённой работы. • Изученный материал: • Особенности VLIW архитектуры Эльбрус 2000. Структура широкой команды. • Структура системы двоичной оптимизирующей трансляции • Стадии обработки входного кода двоичного оптимизирующего компилятора • Операционная семантика промежуточного представления и граф потока управления • в двоичном оптимизирующем компиляторе • Понятие контрольной точки и восстановление Intel x86 контекста • Режим интерпретации lsim_trap • Выявлены основные различия между представлением семантики в трассе результирующего • исполняемого кода микропроцессора VLIW-архитектуры Эльбрус 2000 • и промежуточным представлением двоичного оптимизирующего компилятора: • Intel x86 код – код Эльбрус 2000, а также важная с точки зрения анализа разработчиком при • отладке результирующего кода информация из промежуточного представления компилятора, • которая отсутствует в трассе исполнения. • По результатам анализа из предыдущего пункта разработано средство отладки двоичного • оптимизирующего компилятора Intel x86 -> Эльбрус 2000, позволяющее представить • результат исполнения откомпилированной программы (трассу) • в терминах промежуточного представления компилятора. • Разработанное средство представляет из себя программу, написанную на языке С и • запускаемую из командной строки в операционной системе Linux. 4. Программа обрабатывает трассу исполнения кода, полученного после компиляции любого кода платформы Intel x86, на интерпретаторах микропроцессора Эльбрус 2000 в том числе в режиме моделирования прерываний для тестирования механизма восстановления x86 контекста. Разработанное средство используется при отладке промышленного двоичного оптимизирующего компилятора в фирме МЦСТ.

More Related