문제

1167      ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1);
(gdb) n
1168      if (!ptr) {
(gdb) print ptr
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) print &cwd
$2 = (char (*)[3500]) 0xbff2d96c
(gdb) print strlen(cwd)
$3 = 36
(gdb) print "%s",cwd
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "��O�001\000\000\000\000��027\000\000\000�3����EL鷠3�000��027\000\000\000\000\000\000\000\027\000\000\000\000��/�027\000\000\000�3����N����\230���鷠3�000��027\000\000\000\000\000\000\000��000\000\000\000\001\000\000\000��M鷠3����\000\000\000\000.\231�027��w\005\b\001\000"...
(gdb) print "%s", ptr
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) Quit

ptr은 문자열을 올바르게 인쇄하지만 cwd는 그렇지 않은 이유는 무엇입니까?이는 프로그램에도 영향을 미치며 cwd를 사용하려고 하면 충돌이 발생합니다...

[편집하다:이 변수의 어리석은 버퍼 오버플로로 인해 충돌이 발생한 것으로 밝혀졌습니다.grr...gdb는 아니지만 인쇄 질문은 여전히 ​​유효했습니다.]

도움이 되었습니까?

해결책

그 이유는 cwd 다르게 인쇄되어 있습니다. gdb 왜냐하면 gdb 그걸 안다 ptrchar * (아마도) 그리고 그거 cwd 길이의 배열입니다 3500 (출력에 표시된 대로)그래서 인쇄할 때 ptr 포인터 값(및 서비스로 가리키는 문자열)을 인쇄하고 인쇄할 때 cwd 그것은 인쇄합니다 전체 정렬.

왜 사용하는지 이유가 없습니다. cwd 대신에 ptr 문제가 발생할 수 있지만 확실하게 하려면 몇 가지 코드를 확인해야 합니다.

다른 팁

나는 Mweerden의 의견에 동의합니다.귀하의 코드와 유사하다고 생각되는 것을 시도하면 다음과 같은 결과를 얻습니다.

(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"

gdb에서 나온 것 같으니 그 이후로 cwd 다음과 같이 정의되었습니다. char cwd[3500], gdb는 전체 배열을 인쇄하는 반면, gdb에게 이를 다음과 같이 해석하도록 지시하면 char*, 예상대로 작동합니다.귀하의 응용 프로그램이 충돌하는 경우 다른 원인으로 인해 발생한다고 가정합니다.

저것 ptr 형식이 좋은 문자열로 표시되며 cwd "바이트 버퍼"는 아마도 gdb에만 해당됩니다.어떤 경우에도 애플리케이션에 영향을 주어서는 안 됩니다.~에 따르면 man 3 getcwd, ptr 다음을 가리켜야 한다 cwd (또는 오류가 발생한 경우 NULL이어야 합니다).당신은 사용할 수 있습니까? ptr 프로그램을 충돌시키지 않고?

CWD는 어떤 유형인가요?위의 코드 조각에서는 그 사실을 알려주지 않습니다.void*인 ptr은 gdb에서 다르게 처리될 수 있습니다.

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