2009-08-25 3 views
1

변수의 값을 보려고하는데 디버거가 나에게 "????"값을 표시합니다. 이것은 통화 변수에서 발생하지만 다른 유형에서는 발생하지 않는 것 같습니다 (Double 및 열거 형은 괜찮습니다).Delphi 디버거에 ??? 통화 변수에 대한

델파이 (10) 업데이트를 사용하여 Windows XP SP 3 디버깅하고있어 2

내가 사용하는 과정은 다음과 같습니다

  1. 는 BDS IDE에서 프로젝트를 빌드합니다.
  2. 서비스가 살아있는 것으로 예상되는 디렉토리에 exe를 복사하십시오.
  3. 서비스를 시작하십시오. 로컬에서 실행 중이며 원격 디버깅을 시도하지 않습니다.
  4. 서비스 프로세스에 연결 (실행 | 프로세스에 연결).
  5. 프로세스가 내 중단 점에서 중지되므로 연결이 잘된 것처럼 보입니다.
  6. 변수의 값을 계산하십시오. 변수 이름 위에 마우스를 올리면

    • :

내가 해봤 변수를 알아보고자 하였다. 일반적으로이 값이 표시되지만이 경우 아무 것도 표시되지 않습니다 (즉, 팝업이 표시되지 않음).

  • 변수 이름을 마우스 오른쪽 단추로 클릭하고 디버그, 평가/수정은 ???? 값을 표시합니다.
  • 변수 이름을 마우스 오른쪽 단추로 클릭하고 디버그, 커서에서 감시 추가를 클릭하면 ???? 값이 표시됩니다.
  • 로컬 변수 창에 { 값이 표시됩니다.
  • 통화와 관련이있는 것 같아서 변수 유형을 통화에서 Double로 변경하려고 시도했으며 테스트를 다시 실행했을 때 디버거가 올바른 값을 표시했습니다.

    내가 평가하기 위해 노력하고있어 변수

    이 완료되는 까다로운 아무것도 지역 변수, 예를 들면 다음과 같습니다

    function FooBar: Boolean; 
        var 
        foo: Currency; 
        bar: Double; 
        begin 
        foo := 0; // Breakpoint next line, evaluate foo shows "????" 
        bar := 0; // Breakpoint next line, evaluate bar shows "0" 
        ... 
        end; 
    

    내가 관련이 있다고 생각 프로젝트 옵션은 다음과 같습니다

    Compiler 
        Code Generation 
         Optimization = Off 
         Stack frames = Off 
         Pentium-safe FDIV = Off 
        Syntax options 
         Strict var-strings = On 
         Complete boolean eval = Off 
         Extended syntax = On 
         Typed @ operator = Off 
         Open parameters = On 
         Huge strings = On 
         Assignable typed constants = Off 
        Runtime Errors 
         Range Checking = On 
         I/O Checking = On 
         Overflow Checking = On 
        Debugging 
         Debug Information = On 
         Local Symbols = On 
         Debug Info = On 
         Definitions Only = On 
         Assertions = On 
         Use Debug DCUs = Off 
        Linker 
         Map file = Detailed 
         Linker output = Generate DCUs 
         Exe and DLL options 
         Include TD32 debug info = On 
         Include remote debug symbols = On 
    

    사람이 수 이 문제의 원인을 제시하고 어떻게 작동하게 할 수 있습니까?

    편집 : Currency 변수를 레이블에 서식 지정하는 단추가있는 폼으로 구성된 테스트 프로그램을 시도했습니다. 위에서 설명한대로 디버깅 (프로세스에 연결) 등 디버거가 올바른 값을 보여줍니다. 이제 문제가 서비스 디버깅과 관련이 있는지 궁금해 ...

    답변

    2

    program.exe과 동일한 디렉토리에 program.rsm 파일이 없기 때문에 문제가 발생한 것 같습니다 (내 프로세스의 2 단계에서 EXE가 다른 곳으로 복사 됨).

    Program.rsmInclude remote debug symbols이 활성화 될 때 생성됩니다. 로컬 디버깅 때문에 관련성이 있다고 생각하지는 않았습니다. 원격으로 디버깅 할 때 program.rsm 만 사용했을뿐입니다. 디버깅은 로컬에서 발생하지 않았지만 다른 디렉토리에서는 "원격"이라고합니다. |
    Project :

    • 가에 program.rsm의 경로를 설정합니다

      그래서 세 가지 가능한 솔루션이있을 표시 Options | Debugger | Symbol Tables | Debug symbols search path.

    • 출력 디렉토리를 다음과 같이 설정하십시오.
      Project | Options | Directories/Conditionals | Output directory.

    • program.rsm을 디버그하기 전에 program.exe과 동일한 디렉토리에 복사하십시오.

    통화 변수가 영향을받은 유일한 이유는 아직도 수수께끼입니다.

    2

    흠 - Delphy 2006에서 나를 위해 작동합니다. 작은 콘솔 앱을 만들었을뿐입니다. 해결 방법에 대한 제안 - 변수를 디버거 내부의 int64로 캐스트하십시오. 이 값은 10000을 곱한 값이어야합니다.

    +0

    감사합니다. Tobias, 나는 당신의 제안을 시도했다. 그리고 디버거는 "E2268 정의되지 않은 함수 'Int64'를 호출하여 더 큰 문제가 있다고 생각하게 만들었고 결국에는 내 기호가 올바른 위치에 있지 않음을 발견하게되었다. 설명을위한 나의 대답). 테스트 응용 프로그램을 할애 해 주셔서 감사드립니다. – WileCau