Можно ли программно сломать приложение Native Client в GDB и продолжить выполнение?

Есть ли у кого-нибудь опыт использования отладчика Windows Native Client, как описано здесь для отладки приложения Native Client?

Я пытаюсь запустить программную точку останова или исключение в коде приложения, которое остановит подключенный и работающий GDB в исходной строке, из которой он был запущен, и сможет продолжить выполнение.

Я могу сделать это, создав исключение недопустимого адреса, например:

#define SOFTBREAK { int *p=0; p=0; }

который действительно врывается в отладчик везде, где используется определение:

Program received signal SIGSEGV, Segmentation fault.
0x0000000c00209ba2 in CTestTestList::Init (this=0xfe55d080) at ../testlist.cpp:1242
1242    in ../testlist.cpp

однако я не могу продолжить выполнение с помощью команды jump, чтобы пропустить строку разрыва (используя следующую исходную строку или адрес сборки). Нужно ли подтверждать или сбрасывать ошибку сегментации, прежде чем продолжить?

Кто-нибудь знает, возможно ли продолжить выполнение, используя исключение недопустимого адреса? Или можно использовать другой метод, например, создание программного исключения (EXC_SOFTWARE)? Любая помощь или совет будут оценены.

(Кстати, это мой первый пост с переполнением стека, поэтому прошу прощения, если я не соблюдал правила этикета в этом посте.)

Большое спасибо,

Энди


person aslater    schedule 02.02.2012    source источник


Ответы (2)


Я обычно использую бесконечный цикл для той же цели.

volatile int var = 1;
while (var);

Затем я изменяю соответствующее значение регистра в отладчике.

set $rax = 0
person Ha.    schedule 02.02.2012
comment
Спасибо за отзыв "Ха". Это очень полезно, и это работает для меня. Однако (на всякий случай, если другие следуют этому), кажется, что в версии GDB, которую я использую, «var» является ключевым словом, и поэтому мне пришлось использовать другое имя. Кроме того, поскольку «var» помечен как volatile, он будет считываться из памяти при каждой итерации цикла, поэтому я использовал: вместо этого установите myVar = 0. Еще раз спасибо за это! :) - person aslater; 02.02.2012

Вы можете использовать __asm__("int3"); с winGDB, как описано здесь

~Главная

person Colt McAnlis    schedule 02.02.2012
comment
int 3 был одним из первых, что я попробовал, но это нарушает правила безопасности собственного клиента, поэтому плагин NaCl не может загрузить приложение (ошибка проверки в NACLLOG). (Не уверен, что эту проверку можно отключить?) Спасибо за ответ, Кольт. - person aslater; 03.02.2012