소스를 사용할 수 있어도 gdb가 작동하지 않습니다.

소스를 사용할 수 있어도 gdb가 작동하지 않습니다.

다음을 포함하여 컴파일된 공유 라이브러리가 있습니다 -g -O0.

void MyClass::whatever()
{
  ...
  doSomething(myImage, myPoints);
  ...
}

bool MyClass::doSomething(const Image& image, std::vector<cv::Vec2f>& points) const
{ 
  const int32_t foo = 1;
  const float   bar = 0.1f;
  ...
}

whatever()이제 나는 로 단계별로 진행하고 있지만 s로 단계적으로 진행되지 않고 doSomething()넘어갑니다. (1) 동일한 파일에 있고 (2) 중단점을 설정 doSomething()하고 문제 없이 소스를 통해 단계적으로 이동할 수 있기 때문에 소스 가용성의 문제가 아닙니다 . 그러나 s사용 가능한 소스가 없다고 믿는 것 같습니다.

I 경우 set step-mode on다음과 같은 출력을 얻습니다.

0xb5d51148 in myClass::doSomething (this=0xb25e4, image=..., 
points=std::vector of length -91315, capacity 372871920 = {...})
from /path/to/myclass.so

사용 가능한 소스가 없을 때 얻는 것과 같습니다. 몇 번의 초기화 후에 n소스 foo가 표시됩니다. 따라서 함수 시작 부분에 inline내 매개변수(유형, 릴리스 빌드)를 추가하면 마법 같은 효과가 있을 수 있습니다 . 이 내용을 보고 "이상한 내용이군요. 이 기능 다음에 계속하겠습니다"라고 생각하고 실제로 대부분의 기능에 사용할 수 있는 소스가 없다는 것이 opencv가능합니까 ?gdb

(중요하다면 Ubuntu가 설치된 ARM 상자에서 LLVM/clang 3.5로 컴파일됩니다)

답변1

이는 gcc 최적화 및 후속 문제일 가능성이 높습니다.줄 번호 테이블에 의해 생성됨난쟁이 그 지도

프로그램의 실행 코드와 이 주소에 해당하는 소스 라인을 포함하는 메모리 주소

(8페이지)

가장 간단한 해결책은 다음을 사용하는 것입니다.스테피함수에 도달하면

에서GDB 사용자 매뉴얼(65페이지)

단계

제어가 다른 소스 라인에 도달할 때까지 프로그램을 계속 실행한 다음 프로그램을 중지하고 제어를 gdb로 반환합니다.

....

단계 명령은 소스 라인의 첫 번째 명령에서만 중지됩니다. 이는 스위치 문, for 루프 등에서 발생할 수 있는 다중 중지를 방지합니다. 디버깅 정보가 있는 함수가 해당 행 내에서 호출되면 단계가 계속 중지됩니다. 즉, 단계는 라인 내에서 호출되는 모든 함수 내부로 이동합니다.

또한 단계 명령은 해당 기능에 대한 줄 번호 정보가 있는 경우에만 해당 기능을 입력합니다. 그렇지 않으면 다음 명령처럼 작동합니다. 이는 MIPS 시스템에서 cc -gl을 사용할 때 문제를 방지합니다. 이전에는 루틴에 대한 디버깅 정보가 있는 경우 단계가 서브루틴으로 들어갔습니다.

관련 정보