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


답변:


198

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

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

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


9
참고 : GDB가 stdlib를 볼 수 있도록 프로그램을 이미 실행하고 있어야합니다. 그렇지 않은 경우 :No symbol "strcmp" in current context.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 六四 事件 法轮功 包 卓 轩 : stdlib를 보도록 gdb를 설정하는 방법?
naive231

@ naive231 by "see"나는 소스가 아니라 함수를 깨뜨릴 수 있다는 것을 의미했다 run. 소스를 들어, 구글과 검색 : stackoverflow.com/questions/10000335/...을 :-)
치로 틸리郝海东冠状病六四事件法轮功

1
이 방법은 부작용이있을 수 있습니다. $_streq@tlwhitec의 메소드가 더 좋습니다.
rools

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

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


46

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 을 지원하는을 사용해야 합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.