2014-04-03 3 views
0

바운드 된 Maner에서 명령 추적을 수행하는 GDB 스크립트를 작성하려고합니다 (예 : addr 및 stop addr). 아마 나는 구글에서 실패하고있다. 그러나 나는 실존에서 이것을 발견하는 것처럼 보인다.바운드 된 명령 추적을위한 GDB python 스크립트

는 여기에 내 찔린입니다 :

python 

def start_logging(): 
    gdb.execute("set logging on") 
    gdb.execute("while $eip != 0xBA10012E9") 
    gdb.execute("x/1i $eip") 
    gdb.execute("stepi") 
    gdb.execute(" end") 
    gdb.execute("set logging off") 

gdb.execute("set pagination off") 
gdb.execute("break *0xBA19912CF") 
gdb.execute("command 1 $(start_logging())") 
gdb.execute("continue") 

내 마음에서이 다음 중단 점을 설정가 칠 때 명령을 실행하도록 설정해야합니다. 중단 점이 발생하면 끝 주소에 도달 할 때까지 코드를 한 단계 씩 실행 한 다음 로깅을 해제합니다.

gdb로 실행할 때 응용 프로그램이 올바른 지점에서 중단되지만 명령이 실행되지 않습니다.

내가 뭘 잘못하고 있니? 죄송합니다. 이것이 잘못된 길인 경우 알려 주시기 바랍니다. gdb 스크립팅을 처음 사용했습니다.

답변

1

여기에 몇 가지 이상한 점이 있습니다.

먼저 gdb.execute를 여러 번 호출하여 여러 줄로 된 gdb 명령을 분할하는 것처럼 보입니다. 나는 이것이 효과가있을 것이라고 생각하지 않는다. 확실히 그것은 작동하도록 의도되지 않았습니다.

둘째, gdb.execute를 통해 "while"루프를 수행 할 이유가 없습니다. 파이썬에서 직접하는 것이 낫다.

셋째, "명령"줄이 꽤 잘못된 것처럼 보입니다. 나는 정말로 무엇을하려고하는지 알지 못한다. 브레이크 포인트에 부딪혔을 때 start_logging을 호출 할까? 그리고 계속 하시겠습니까? 음, 그것은 쓰여진대로 작동하지 않습니다.

은 내가 제안 것은 같은 : 당신이 정말로 로깅을 원하는 경우

gdb.execute('break ...') 
gdb.execute('run') 
while gdb.parse_and_eval('$eip') != 0x...: 
    gdb.execute('stepi') 

, 중 하나 '로 설정 로깅'사업을하거나 문자열을 반환하고 파이썬에서 그것을 기록 할 gdb.execute을 지시합니다.

+0

응답 해 주셔서 감사합니다. gdb.execute가 명령을 실행하는 데 필요하다고 생각했습니다. 파일에 오류가 발생했을 때 오류가 발생했습니다. gdb.execute에 하나의 문자열로 넣으려고 시도한 다중 행 gdb 명령과 didnt은 다중 명령 인 이유 중 하나입니다. 제안 된 예제에서 break 명령 대신 내 코드를 사용하여 시도해 보겠습니다. –

+0

내 스크립트를 업데이트로 업데이트 했으므로 중단 점에 도달하는 데 문제가 있습니다. 설정하고 gdb쪽에 그것은 응용 프로그램을 실행하는 것이라고 생각하는 것, 그냥 기다려 교수형으로. 그러나 응용 프로그램은 여전히 ​​멈춘 것으로 생각합니다. Ctrl + c gdb를 누른 다음 수동으로 계속 입력하면 작동합니다. 그런데 내 대본이 왜 작동하지 않습니까? –