Как выполнить цикл в скрипте GDB до завершения программы?

define traverse
    while(CONDITION)
        if $start == 0
            set $start = 1
            print_node
            print_rss_item
        else
            continue
            print_node
            print_rss_item
        end
    end
end

В каком состоянии мне нужно остановить цикл, если программа завершена?

7 голосов | спросил user3084621 10 TueEurope/Moscow2013-12-10T02:04:24+04:00Europe/Moscow12bEurope/MoscowTue, 10 Dec 2013 02:04:24 +0400 2013, 02:04:24

2 ответа


0

Глядя на ваш скрипт GDB:

define traverse
    while(CONDITION)
        if $start == 0
            set $start = 1
            print_node
            print_rss_item
        else
            continue
            print_node
            print_rss_item
        end
    end
end

Несколько вещей на заметку:

  1. Сценарий GDB (так называемый «отладчик») и отладчик всегда работают в режиме переключения: КОГДА РАБОТАЕТ СЦЕНАРИЙ GDB, отладчик приостанавливается и НЕ работает, и всякий раз, когда DEBUGGEE выполняется, сценарий GDB приостановлено и НЕ РАБОТАЕТ.

  2. Почему это так? Это происходит потому, что всякий раз, когда отладчик находится в режиме паузы (считывание API «ptrace ()» и его различных опций: PEEKUSER, POKEUSER, PTRACE_CONT), отладчик действительно может чисто (и согласованно с памятью) читать память отладчика, не опасаясь коррупция и, следовательно, значения всех ее переменных и т. д.

Когда отладчик не запущен, т. е. выполнил операцию «продолжить», когда управление передается отладчику, таким образом, отладчик может продолжать работать и изменять свою собственную память, не опасаясь ошибочного чтения другим процессом - потому что это не могло случиться.

Итак, как мы узнаем, когда отладчик закончил? Когда «continue» не удалось и, следовательно, gdbscript не будет продолжать работать. Но если вы настраиваете отладчика без каких-либо точек останова, то, выполнив команду gdb "run", вы обнаружите, что отладчик запускается непрерывно, без возможности выполнения сценария gdb.

Таким образом, если ваш скрипт работает, то отладчик находится в режиме STOP, и наоборот. И если отладчик завершил работу с помощью метода exit (), сценарий gdb также не будет запущен.

, например:

defining the macro (inside .gdbinit file):

define myloop_print
set $total = $arg0
set $i = 0
   while($i<$total)
     set $i = $i + 1
     print $i, $i
     cont
   end
end

И затем, запустив «gdb /bin /ls», затем «break write» и «run -al», а затем «myloop_print 10000» (последовательность или порядок важны), мы видим, что каждый «пишет» его сломается и gdbscript распечатает счетчик.

И последние несколько выполненных строк:

Breakpoint 1, write () at ../sysdeps/unix/syscall-template.S:81
81  in ../sysdeps/unix/syscall-template.S
$40571 = 285
drwxrwxr-x   2 tthtlc tthtlc    4096 Feb 18 00:00 yocto_slide
[Inferior 1 (process 7395) exited normally]
$40572 = 286
The program is not being run.
(gdb) 

Что ясно показывает, что последний напечатанный счетчик - 286, хотя в качестве предела я указал 10000.

Запуск макроса без отладчика:

(gdb) myloop_print 10000
$40573 = 1
The program is not being run.
(gdb) 

Мы видим, что gdbscript не будет работать.

И если вы выполните команду "gdb /bin /ls", а затем "myloop_print 10000" (при условии, что макрос определен внутри .gdbinit), то вы получите запуск gdbscript до 10000 циклов - без отладчика, когда-либо работающего.

ответил Peter Teoh 28 J000000Tuesday15 2015, 17:10:19
0

Просто цикл в бесконечном цикле. Он выйдет после завершения программы.

define traverse
    while(1)
        if $start == 0
            set $start = 1
            print_node
            print_rss_item
        else
            continue
            print_node
            print_rss_item
        end
    end
end
ответил petersohn 28 J000000Tuesday15 2015, 12:39:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132