GDB에서 특정 중단점이 히트했을 때 특정 액션을 수행하려면 어떻게 해야 합니까?
gdb에서 특정 브레이크 포인트가 히트했을 때 어떤 조치를 취할 수 있는 방법을 찾고 있습니다.
기본적으로 제 프로그램에는 memleak이 몇 개 있습니다.malloc와 free 함수가 히트하면 함수(스텝)에 들어가 Addr, size 등 기본적인 정보를 수집해야 합니다(기본적으로 값을 인쇄합니다).완료되면 프로그램을 다시 시작합니다.
우리가 이걸 할 좋은 방법이 있나요?
예를 들어, 여기서 중단점 명령을 사용하여 x가 양수일 때마다 foo에 입력 시 x 값을 인쇄할 수 있습니다.
break foo if x>0
commands
silent
printf "x is %d\n",x
cont
end
명령어 목록에서 처음 지정한 명령어가silent
는, 브레이크 포인트에서 정지하는 것에 관한 통상의 메세지는 인쇄되지 않습니다.이는 특정 메시지를 인쇄한 후 계속해야 하는 중단점에 적합합니다.나머지 명령어 중 아무것도 출력되지 않으면 브레이크 포인트에 도달했다는 표시가 표시되지 않습니다.사일런트란 브레이크 포인트명령어 목록의 선두에만 의미가 있습니다.
브레이크 포인트명령어 어플리케이션 중 하나는 다른 버그를 테스트할 수 있도록 한 버그를 보정하는 것입니다.잘못된 코드 행 바로 뒤에 중단점을 두고, 오류가 발생한 경우를 감지하는 조건을 부여하고, 오류가 필요한 변수에 올바른 값을 할당하는 명령을 부여합니다.프로그램이 중지되지 않도록 continue 명령으로 종료하고 출력이 생성되지 않도록 silent 명령으로 시작합니다.다음은 예를 제시하겠습니다.
break 403
commands
silent
set x = y + 4
cont
end
프레드릭의 대답을 명확히 하기 위해commands
(또는 그냥command
중단점을 설정하기만 하면 자동으로 인식되는 것 같습니다.즉, 프레드릭이 보여주는 것은 여러 개의 선이 아니라break
명령어, 두 개의 개별 명령어입니다.break
,그리고.commands
. 다음과 같습니다.
(gdb) break 989
Breakpoint 23 at 0x7fffe2761dac: file foo.cpp, line 989.
(gdb) command
Type commands for breakpoint(s) 23, one per line.
End with a line saying just "end".
>silent
>print result
>end
(gdb) c
Continuing.
$79 = {elems = {0, 0}}
(gdb)
dprintf
(동적)printf
)
https://sourceware.org/gdb/onlinedocs/gdb/Dynamic-Printf.html
이것은 인쇄물의 특정 경우에 가장 편리한 솔루션입니다.
dprintf <line>, "%u\n", variable
또, 보다 고속이 될 수도 있습니다.commands
이는 매우 느린 임의의 명령 문자열을 해석하기 위해 GDB에 제어권을 주는 대신 코드를 컴파일하고 주입할 수 있기 때문입니다.TODO 나는 이것이 실제로 완성되었는지 모른다. dprintf
대commands
: dprintf와 break + 명령어 + continue의 차이점은 무엇입니까?
자세한 예:
메인
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
uint32_t i;
uint32_t r = 0;
for (i = 0; i < 10; ++i) {
r += i*i + 13*r*i + 17; /* LINE 10. */
}
printf("%" PRIu32 "\n", r);
return EXIT_SUCCESS;
}
그 후, 다음과 같이 입력합니다.
gcc -ggdb3 -O0 -std=c99 -o main main.c
gdb -batch --nh -q -ex 'dprintf 10, "%u %u\n", i, r' -ex 'run' ./main
출력:
Dprintf 1 at 0x400545: file main.c, line 10.
0 0
1 17
2 256
3 6933
4 277346
5 14699371
6 970158528
7 3628079733
8 3070853710
9 317092431
3057168588
[Inferior 1 (process 14305) exited normally]
Ubuntu 16.04, GDB 8.2에서 테스트 완료.
언급URL : https://stackoverflow.com/questions/6517423/how-to-do-an-specific-action-when-a-certain-breakpoint-is-hit-in-gdb
'sourcecode' 카테고리의 다른 글
템플릿 Vue 내에 스크립트 태그를 삽입합니다. (0) | 2022.08.17 |
---|---|
SPI및 API의 차이? (0) | 2022.08.17 |
Vue - 중첩된 속성의 기본값 (0) | 2022.08.17 |
C의 char 문자열을 수정할 수 있습니까? (0) | 2022.08.17 |
"실험 구문 'jsx'에 대한 지원이 현재 활성화되지 않았습니다." vue 및 jest를 사용합니다. (0) | 2022.08.17 |