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-next
와 auto-step
향상된 오류 처리를 포함하여 더욱 완전한(업데이트된) 코드를 얻으려면