вот макрос для айса: XXX="BPM EIP X IF (/* условие-продолжение трассировки */) DO \"G;T;BC bpindex;XXX;\""; так вот он зараза не работает ;( есть какие идеи почему такое может быть и как с этим бороться?
n2k Ты хочешь этим макросом трассировать программу только тогда, когда выполняется "условие"? Я верно понял? Если да, то непонятно, зачем тебе в DO команда 'G'? Продолжать работу после каждого прерывания? Но именно она, IMHO, тебе и мешает. Допустим, условие выполнилось, и запустилось действие DO. Тогда первой же его командой - в данном случае 'G' - SI снова запускается в работу со следующей команды (программы, НЕ макроса!) (так как стартовый адрес в 'G' не указан) и будет работать "до скончания века" (адрес остановки в 'G' также не указан!). Ведь прервать работу сможет лишь повторное попадание на эту же (или какую другую) контрольную точку. ("The G command without parameters behaves the same as the X command.", - сказано в справочнике по командам.) И продолжить свою работу - выполнить команду 'T' и все последующие - макрос не сможет. После попадания на контрольную точку начнется повторное выполнения заданного действия 'DO', т.е. снова будет выдана команда 'G' Вот лог работы аналогичного макроса (без 'if'): Код (Text): :xxx :g Break due to BP 00: BPMB 0008:F8818C7E X DR0 DO "g; t; bc bpindex; xxx" (ET=14.31 microseconds) Break due to BP 00: BPMB 0008:F8818C7E X DR0 DO "g; t; bc bpindex; xxx" (ET=62.55 microseconds) Break due to BP 00: BPMB 0008:F8818C7E X DR0 DO "g; t; bc bpindex; xxx" (ET=65.18 microseconds) ... Идут сплошные прерывания без продолжения работы макроса, остановить которые можно только по Ctrl-D. Попробуй обойтись без 'G'.
Sergey_R мужик, я тебя уважаю, но ты не прав. когда мы говорим :BPX EIP то... ничего не происходит. а должно? если мы дадим T - EIP перейдет на след. кмнд,но бряк невплывет (а он и не должен,т.к. T обрабатывает сам айс) поэтому мы даем X или G. Вот тогда айс всплывает! после чего мы делаем T для перехода на след. команду, удаляем пред. точку останова и ставим новую. осталась разобраться с этими гребанными кавычками, на которые айс шибко ругается
n2k А не прав в чем? В описании работы команды 'G'? Вот тебе более подробный лог практически твоего макроса. (Для наглядности добавлена команда 'r -d'.) Код (Text): :macro xxx ="bpm eip x do \"g; r -d; t; bc bpindex; xxx;\"" Macro: 'xxx' defined :xxx :g Break due to BP 00: BPMB 0008:F8818C7E X DR0 DO "g; r -d; t; bc bpindex; xxx;" (ET=13.64 microseconds) Break due to BP 00: BPMB 0008:F8818C7E X DR0 DO "g; r -d; t; bc bpindex; xxx;" (ET=60.81 microseconds) ... Как видишь, никаких регистров и никакого перемещения контрольной точки. Бесконечный цикл был остановлен по Ctrl-D и тут!... Код (Text): ... :bd 0 CS:EIP=0008:F8818C7E SS:ESP=0010:8053E438 EAX=C12F931E EBX=00000000 ECX=FFDFFC70 EDX=0000034A ESI=821B81F0 EDI=00000000 EBP=8053E450 EFL=00000202 DS=0023 ES=0023 FS=0030 GS=0000 Symbol not defined (t) Symbol not defined (t) Break due to BP 00: BPMB 0008:F8818C80 X DR0 DO "g; r -d; t; bc bpindex; xxx;" (ET=14.56 microseconds) Break due to BP 00: BPMB 0008:F8818C80 X DR0 DO "g; r -d; t; bc bpindex; xxx;" (ET=18.56 microseconds) ... Точка была отключена ('bd 0'), а по возвращении в SI макрос продолжил работать дальше. (Все правильно - ведь выполнение команды 'G' было завершено!) Тут тебе и вывод содержимого регистров и смена адреса контрольной точки ('BPMB 0008:F8818C80 ...'). (Не могу сказать, что означает в данном случае "Symbol not defined (t)". Возможно, какие-то обрывки с клавиатуры или из макроса.) Ну а дальше опять пошел бесконечный цикл... Я не очень понимаю твою задачу, но попробуй такой вариант - перемести g; в конец строки макроса: Код (Text): :MACRO xxx = "bpm eip x do \"t;r -d;bc bpindex; xxx;g;\"" Macro: 'xxx' defined :xxx :g Break due to BP 00: BPMB 0008:806B9C04 X DR0 DO "t;r -d;bc bpindex; xxx;g;" (ET=2.24 microseconds) CS:EIP=0008:806B9C09 SS:ESP=0010:F8962D30 EAX=F87DFC00 EBX=00000000 ECX=F87DFC70 EDX=DDA89652 ESI=8232F200 EDI=0000002C EBP=F8962D50 EFL=00000082 DS=0023 ES=0023 FS=0030 GS=0000 Break due to BP 00: BPMB 0008:806B9C09 X DR0 DO "t;r -d;bc bpindex; xxx;g;" (ET=2.26 microseconds) CS:EIP=0008:806B9C0B SS:ESP=0010:F8962D30 EAX=3CF78000 EBX=00000000 ECX=F87DFC70 EDX=00000C2E ESI=8232F200 EDI=0000002C EBP=F8962D50 EFL=00000246 DS=0023 ES=0023 FS=0030 GS=0000 Break due to BP 00: BPMB 0008:806B9C0B X DR0 DO "t;r -d;bc bpindex; xxx;g;" (ET=2.27 microseconds) CS:EIP=0008:806B9C0D SS:ESP=0010:F8962D30 EAX=3CF78000 EBX=00000000 ECX=F87DFC70 EDX=00000C2E ESI=8232F200 EDI=0000002C EBP=F8962D50 EFL=00000246 DS=0023 ES=0023 FS=0030 GS=0000 ... В таком виде макрос делает и переход на следующую команду и переустановку контрольной точки. А что с ними не так?