programing

gdb: 현재 컨텍스트에 기호 "i"가 없습니다.

closeapi 2023. 10. 13. 22:14
반응형

gdb: 현재 컨텍스트에 기호 "i"가 없습니다.

C 프로그래밍 gdb를 디버깅하는 동안 for loop에 중단점이 있습니다."i" 값을 인쇄할 수 없습니다(현재 컨텍스트에서 기호 "i"가 없습니다.).나는 다른 변수들의 값을 인쇄할 수 있습니다.정상인가요?

루프는 다음과 같습니다.

for (i=0; i < datasize; i++){  
    if ( feature_mask[i] > 0 ){  
        k = feature_mask[i] - 1;  
        if (neighbors[k][nmax-1] != 0){
            neighbors[k][nmax-1] = bvalue;  
            feature_mask[i] = -feature_mask[i];
        }
    }
}

만 되었을 수 .feature_mask[i]순환 내에

컴파일러를 호출할 때 최적화 수준을 지정했습니까?이 gcc를 하고 있다면,면 gcc합니다.-O옵션을 선택한 후 다시 시도합니다.

저는 최근에 이 문제를 접했습니다.저는 GCC 5.1을 컴파일한 다음 C++11 코드베이스를 컴파일하는 데 사용했습니다.그리고 gdb에서 프로그램의 코드를 확인할 수는 있었지만 변수 값을 인쇄할 수는 없었지만 모든 변수에 대해 "현재 컨텍스트에서 "xyz 기호 없음" 오류가 계속 발생했습니다.

저는 gdb 7.4를 사용하고 있었습니다만, 당시 사용 가능한 최신 버전은 7.9입니다.최신 버전의 gdb를 다운로드하여 컴파일(GCC 5.1 사용)하였고, gdb 7.9 사용 시 변수 값을 다시 성공적으로 검사할 수 있었습니다.

GCC 5.1의 디버그 정보는 gdb 7.4와 호환되지 않는 것 같습니다.

프로그램이 최적화되지 않고 디버깅 정보가 활성화된 상태에서 컴파일되었는지 확인합니다.루프 카운터가 결국 레지스터에 저장될 가능성이 높습니다.

최적화 옵션을 확인합니다.를 GCC이 있습니다.feature_mask.

를 로 할 수 .volatile 하면 할 수 . 입니다( 을).i(Debugger 내부에서 볼 수 있음).

만약 다른 사람이 당신의 프로젝트에 구글의 바젤 빌드 시스템을 사용하고 있다면, 나는 당신이 어떠한 변수도 출력할 수 없다면 그것을 추가하고 싶습니다.gdb, 그것은 아마도 당신이 적절하게 추가할 필요가 있기 때문일 것입니다.-ggdb그리고.-O0(update: 사용 대신 사용)-O0 이상-Og C 하여 C 를 .--copt=(옵션)을 --per_file_copt=선택.는 둘 다을 했지만 저 같은 경우에는, 둘 다 잘 지어서 운영하긴 했지만, 둘 다 잘 지어서 운영하긴 했지만만.--copt=할 수 가 만,--per_file_copt=하나는 또한 gdb를 사용할 수 있게 해주었지만 변수를 인쇄하는 것은 허락하지 않았습니다.

: 만 하십시오.test와 함께build장치 테스트도 실행할 필요가 없는 경우.

UDPATE: 디버깅을 할 때는 오버를 선호하는 것으로 드러났기 때문에 이 예시들을 업데이트하고 있습니다.여기를 참조:컴파일러의 '-O0' 옵션과 '-Og' 옵션의 차이점은 무엇입니까?

그럼, 이렇게 하세요.

time bazel test --copt=-ggdb --copt=-O0 \
//my/build/folder1/... //my/build/folder2/...

이 대신:

time bazel test --per_file_copt=//my/build/folder1/...,//my/build/folder2/...@-ggdb,-O0 \
//my/build/folder1/... //my/build/folder2/...

...gdb 내에서 변수를 인쇄할 수 있도록 하기 위해서입니다.

다시 말하지만, 위의 두 가지 기술은 모두 잘 구축되고 실행되며, 둘 다 내가 gdb를 실행하고 사용할 수 있게 해주지만, 실제로는 첫 번째 기술만이 내가 사용할 수 있게 해줍니다.gdb 최대한으로

마지막으로 위의 첫 번째 명령이 여전히 작동하지 않으면 다음 명령을 추가합니다.--strip=neverBazel이 디버깅 정보를 제거하는 것을 방지하기 위해 여기에 설명된 Bazel 플래그입니다.이제 명령은 다음과 같습니다.

time bazel test --copt=-ggdb --copt=-O0 --strip=never \
//my/build/folder1/... //my/build/folder2/...

참조 문서:

  1. --copt=:
    1. https://docs.bazel.build/versions/마스터/명령줄-참조.html#flag--copt
    2. [better, 예제 포함] https://docs.bazel.build/versions/마스터/사용자-매뉴얼.html#flag--copt
  2. --per_file_copt:
    1. https://docs.bazel.build/versions/마스터/명령줄-reference.html#flag--per_file_copt
    2. [better, with example] https://docs.bazel.build/versions/마스터/사용자-manual.html#flag--per_file_copt
  3. --strip=never:
    1. https://docs.bazel.build/versions/마스터/사용자-매뉴얼.html#flag--스트립
  4. [나만의 Q&A] 선호하는 것보다 -O0위에-Og디버깅의 경우:컴파일러의 '-O0' 옵션과 '-Og' 옵션의 차이점은 무엇입니까?

언급URL : https://stackoverflow.com/questions/3758614/gdb-no-symbol-i-in-current-context

반응형