GDB가 느리다

GDB가 느리다

CTRL나는 ARM 어셈블리 코드 실행에 대한 멋진 데모를 하고 있으며 ( +를 누를 때까지 C) 매 1초마다 코드를 무한히 실행하기 위해 GDB가 필요합니다. 누구든지 해결책이 있습니까?

방문객들이 내 부스를 방문할 때 계속 키보드 앞에 서서 프로그램을 실행하고 싶지 않습니다.

답변1

Gdb의 CLI는 while루프를 지원합니다. 내장된 명령은 없지만 sleep쉘을 호출하여 프로그램을 실행 sleep하거나 gdb의 내장 Python 인터프리터(사용 가능한 경우)를 사용할 수 있습니다. Control-C로 중단할 수 있습니다.

방법 1:

(gdb)그리고 (1)
 >단계
 >쉘 수면 1
 >

방법 2:

(gdb)파이썬 가져오기 시간
(gdb)그리고 (1)
 >단계
 >파이썬 time.sleep(1)
 >

방법 3(매크로 정의):

(gdb)정의가 느리게 실행됩니다.
"runslowly"를 정의하는 명령을 입력합니다.
"END" 줄로 끝납니다.
>파이썬 가져오기 시간
>그리고 (1)
 >단계
 >파이썬 time.sleep(1)
 >
>
(gdb)파일이 느리게 실행됩니다.
"runslowly" 유형에 대한 문서입니다.
"END" 줄로 끝납니다.
>1초마다 한 줄씩 걷는다.
>

(gdb)천천히 달리다

답변2

expect이는 자동화될 수 있습니다.

#!/usr/bin/env expect
spawn -noecho gdb -q ls
expect -ex {(gdb)}
send -- "break main\r"
expect -ex {(gdb)}
send -- "run\r"
while {1} {
    expect -ex {(gdb)}
    send -- "s\r"
    sleep 1
}

또는 프로그램이 소진될 위험이 있는 경우 s반복할 수 있지만 gdb조금 더 복잡합니다.

#!/usr/bin/env expect

while {1} {
    spawn -noecho gdb -q ls
    expect -ex {(gdb)}
    send -- "break main\r"
    expect -ex {(gdb)}
    send -- "run\r"
    expect {
        -ex {The program is not being run} {}
        eof {}
        -ex {(gdb)} {
            send -- "s\r"
            sleep 1
            exp_continue
        }
    }
}

답변3

명령에서 쉘 파이프를 사용할 수 있다는 아이디어는 다음과 같습니다.

while :; do echo step; sleep 1; done | gdb arm-program

gdb는 파이프에서 명령을 읽습니다. 무한 루프에서 매초마다 "단계" 명령을 봅니다.

몇 가지 중단점을 설정하고 프로그램을 실행할 수 있습니다.

(echo br 1; echo run; while :; do echo step; sleep 1; done ) | gdb arm-program

답변4

현재 허용되는 답변은언제나 step, 일단 시작되면 중단점, 신호 및 심지어 프로그램 종료까지 "건너뜁니다"(마지막 경우 gdb 내부 중단이 발생하기 전에 "프로그램이 실행되지 않습니다"라는 오류가 발생합니다 while).
또 다른 원인으로, GDB가 "full"을 출력하면 페이징이 켜져 있으면(기본값) 정지됩니다.

이 문제는 Python API를 사용하여 훌륭하게 처리할 수 있습니다.

  • 사용자 명령 정의(자동 단계 실행 속도를 지정하는 추가 매개변수 포함)
  • 선택 사항: 기본 매개변수 정의(단순화를 위해 여기에서는 고정 값으로 대체됨)
  • Python에서 while 루프를 실행하고 CTRL-C에 대해 "예상되는" 키보드 인터럽트를 처리합니다.
  • stop중지 이유를 확인하고 거기에 단계 유형을 저장하려면 이벤트 핸들러를 등록하세요 .
  • "간단하지 않은" 중지(중단점/감시점/신호/...)를 중지하도록 while 루프를 조정합니다.

다음 코드를 gdb-auto-step.py에 배치하여 source gdb-auto-step.py필요할 때마다 활성화할 수 있습니다(또는 항상 사용할 수 있도록 .gdbinit 파일에 포함).

import gdb
import time

class CmdAutoStep (gdb.Command):
    """Auto-Step through the code until something happens or manually interrupted.
An argument says how fast auto stepping is done (1-19, default 5)."""
    def __init__(self):
        print('Registering command auto-step')
        super(CmdAutoStep, self).__init__("auto-step", gdb.COMMAND_RUNNING)
        gdb.events.stop.connect(stop_handler_auto_step)

    def invoke(self, argument, from_tty):

        try:
            frame = gdb.newest_frame()
        except gdb.error:
            raise gdb.GdbError("The program is not being run.")

        number = 5 # optional: use a parameter for the default
        if argument:
            if not argument.isdigit():
                raise gdb.GdbError("argument must be a digit, not " + argument)
            number = int(argument)
            if number == 0 or number > 19:
                raise gdb.GdbError("argument must be a digit between 1 and 19")

        sleep_time = 3.0 / (number * 1.4)

        global last_stop_was_simple
        last_stop_was_simple = True

        pagination = gdb.execute("show pagination", False, True).find("on")
        if pagination:
            gdb.execute("set pagination off", False, False)
        
        try:
            while (last_stop_was_simple):
                gdb.execute ("step")
                time.sleep(sleep_time)
        except KeyboardInterrupt as ki:
            if pagination:
                gdb.execute("set pagination on", False, False)
        except gdb.GdbError as user_error:
            if pagination:
                gdb.execute("set pagination on", False, False)
            # pass user errors unchanged
            raise user_error
        except:
            if pagination:
                gdb.execute("set pagination on", False, False)
            traceback.print_exc()

def stop_handler_auto_step(event):
    # check the type of stop, the following is the common one after step/next,
    # a more complex one would be a subclass (for example breakpoint or signal)
    global last_stop_was_simple
    last_stop_was_simple = type(event) is gdb.StopEvent

CmdAutoStep()

바라보다https://stackoverflow.com/a/67470615/5027456속도 매개변수 auto-nextauto-step향상된 오류 처리를 포함하여 더욱 완전한(업데이트된) 코드를 얻으려면

관련 정보