GDB에서“무언가가 터미널에 인쇄 된 것”에 중단 점을 어떻게 올릴 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1538463

문제

내부의 위치에서 알고 싶습니다 거대한 응용 프로그램 특정 메시지가 인쇄됩니다. 응용 프로그램은 너무 크고 오래되어서 텍스트를 터미널에 인쇄하는 모든 방법을 사용합니다. 예를 들어 printf (), fprintf (stdout, ...) 등

Write () 시스템 호출에 중단 점을 넣기 위해 글을 쓰지만 Write ()를 사용하는 다양한 파일 I/O 작업으로 인해 너무 많은 브레이크 포인트 정지가 침수됩니다.

기본적으로 프로그램이 터미널에 무언가를 인쇄 할 때마다 GDB가 중지되기를 원하지만 동시에 프로그램이 파일에 무언가를 쓸 때 GDB가 중지되기를 원하지 않습니다.

도움이 되었습니까?

해결책

첫 번째 매개 변수를 확인하는 조건부 중단 점을 사용하십시오. 64 비트 x86 시스템에서 조건은 다음과 같습니다.

(GDB) B 1 == $ rdi 인 경우 쓰기

32 비트 시스템에서는 매개 변수가 스택에 있기 때문에 더 복잡합니다. 즉, $ esp를 int *에 캐스트하고 FD 매개 변수를 색인해야합니다. 이 시점의 스택에는 리턴 주소, 길이, 버퍼 및 마지막으로 FD가 있습니다.

이는 하드웨어 플랫폼마다 크게 다릅니다.

다른 팁

GDB 7.0을 사용하면 syscall write ()에서 조건부 중단 점을 설정할 수 있습니다.

(gdb) catch syscall write
Catchpoint 1 (syscall 'write' [4])
(gdb) condition 1 $ebx==1

$ ebx는 첫 번째 syscall 매개 변수 - 여기에 FD 번호를 포함합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top