[c] char * x가 값이“hello”인 문자열을 가리키는 경우 gdb에서 조건부 중단 점을 어떻게 설정합니까?

char* x값이 같은 문자열을 가리킬 때 gdb가 x 행에서 끊어 지도록 지정할 수 있습니까 "hello"? 그렇다면 어떻게?



답변

당신은 사용할 수 있습니다 strcmp:

break x:20 if strcmp(y, "hello") == 0

20행 번호이며 x모든 파일 이름 y이 될 수 있으며 모든 변수가 될 수 있습니다.


답변

break x if ((int)strcmp(y, "hello")) == 0

일부 구현에서 gdb는 strcmp의 반환 유형을 알 수 없습니다. 그것은 당신이 캐스팅해야한다는 것을 의미합니다. 그렇지 않으면 항상 참으로 평가됩니다!


답변

GDB 7.5부터는 다음과 같은 기본 편의 기능을 사용할 수 있습니다 .

$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)

strcmp()중단 점에 도달 할 때마다 프로세스 스택에서 “외부”를 실행하는 것보다 훨씬 덜 문제가있는 것 같습니다 . 다중 스레드 프로세스를 디버깅 할 때 특히 그렇습니다.

GDB는 Python 지원으로 컴파일해야하며 현재 Linux 배포판의 문제는 아닙니다. 확실하게 show configurationGDB 내부 에서 실행 하고을 검색하여 확인할 수 있습니다 --with-python. 이 작은 oneliner도 트릭을 수행합니다.

$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
             --with-python=/usr (relocatable)

데모 사례의 경우 사용법은

break <where> if $_streq(x, "hello")

또는 중단 점이 이미 존재하고 조건을 추가하려는 경우

condition <breakpoint number> $_streq(x, "hello")

$_streq전체 문자열과 만 일치하므로 더 교활한 것을 원하면 Python 정규 표현식 구문$_regex 을 지원하는을 사용해야 합니다 .


답변