현재 소스 또는 심볼에 액세스 할 수없는 곳에서 발생하는 까다로운 버그가 있습니다. 즉, 충돌이 발생한 곳의 명령어 및 해당 주소를 볼 수 있지만 그게 전부입니다 그것. 내가 무엇을하고 싶은지는 gdb
이 상호 작용을 요구하지 않고 실행되고 모든 명령어를 표시하므로이지만 아직 수행 할 방법을 찾지 못했습니다.gdb에서 실행 된 각 어셈블리 명령어 표시
는 내가 달성을 기대하고있어이 같은 것입니다 :
(gdb) /* some command */
0x2818a7c0: push %ebp
0x2818a7c1: mov %esp,%ebp
0x2818a7c3: push %ebx
0x2818a7c4: sub $0x4,%esp
...
0x28563622: mov %esi,0x0(%eax)
Program received signal SIGSEGV, Segmentation fault.
내가, 프로그램 카운터의 표시를 설정과 같이됩니다 해왔 :
(gdb) display/i $pc
을 그리고 stepi
코드를 실행 :
(gdb) stepi
1: x/i $pc 0x2818a7c0: push %ebp
그러나 충돌은 수백 또는 t입니다. 명령의 집을 멀리두고, 여러 번 "들어가라"고 할 필요없이 각자를 (함께한다면) 함께 볼 수있는 방법을 원합니다. 또한 수동으로 수행해야하는 경우 각 명령어 사이에 (gdb)
프롬프트가 표시되는 것이 좋을 것입니다. 나는 간단히 살펴본
한 경로는 scripting이지만, 내 유일한 생각은 표시하고 (다음 명령에 대한) 또 다른 휴식 후 계속하지만 내가 commands
를 사용할 수없는 한 main()
에 설치하는 것입니다 commands
블록 안에 있기 때문에 상상할 수있는 방식으로 작동하지 않습니다.
중요한 경우, 저는 FreeBSD에서 일하고 있습니다.
나는 현재 FreeBSD에서 작업하고 있음을 알리기 위해 내 질문을 업데이트했다. –
아, 현재 IDA는 FreeBSD 바이너리 디버깅을 지원하지 않습니다. 그러나 여전히 디스어셈블러 (Windows/Wine 또는 FreeBSD에서의 Linux 지원)로 사용할 수 있습니다. 죽은 목록을 보는 것보다 훨씬 낫습니다. –