문제

프리 프로세서 코드 블록의 끝에서 변수가 변경되는 것으로 보이는 코드 덩어리가 있습니다.

int initialKeyCount;
#if(DEBUG)
//          int initialKeyCount = _root.CountAllKeys();
      initialKeyCount = 20000;
#endif
      currNode = currNode.EnsureDegreeKeysPresent(parent); //initialKeyCount = 19969 here
#if(DEBUG)
      int currentKeyCount = _root.CountAllKeys();
      Debug.Assert(initialKeyCount == currentKeyCount,
               string.Format("EnsureDegreeNodesPresent changed the node count from {0} to {1}.", initialKeyCount, currentKeyCount));
#endif

Debugger InitialKeyCount = 19969에서 20000을 할당 한 후 19969에서 이것을 실행할 때 나는 이것을 조금 가지고 놀았으며, 초기 키 카운트에 대한 할당이 첫 번째 사전 프로세서 블록 내부에서 정확하지만, 코드가 첫 번째 사전 프로세서를 떠나 자마자. 가치를 19969 년으로 마술처럼 차단하십시오.

이 동작은 변수가 첫 번째 사전 프로세서 블록 내부 또는 외부로 선언되는지 여부에 관계없이 동일합니다. 이 값은 19969 년 두 번째 사전 프로세서 블록 내부에 남아 있습니다.

사전 프로세서 블록에서 할당이 해당 블록 외부에서 정의되지 않은가요? 그것은 틀린 것 같지만 여기서 일어나는 일인 것 같습니다.

도움이 되었습니까?

해결책

Visual Studio가 혼란스러워하는 것 같습니다. 이 단계를 순서대로 사용해보십시오

  1. 깨끗한 명령을 사용하십시오
  2. Visual Studio를 다시 시작하십시오
  3. 원격으로 당신의 프로그램처럼 보이는 모든 dll과 exe를 삭제하십시오.
  4. 모든 빈과 OBJ 폴더를 두 번 확인하여 놓친 것이 있는지 확인하십시오.
  5. 원격으로 당신의 프로그램처럼 보이는 DLL과 exe에 대해 전체 하드 드라이브를 검색하고 삭제하십시오.

나는 일주일에 한 번 내가 일했던 IT 회사에서 이것을 보곤했다. 일반적으로 같은 프로젝트의 여러 사본이있을 때 발생하지만 그 없이도 보았습니다.

다른 팁

이러한 종류의 동작은 디버거가 편집중인 소스 코드와 일치하지 않는 코드를 실행하는 것처럼 들립니다. 소스 변경 사항이 실행중인 코드까지 모든 방향으로 만들어지고 있다고 확신합니까?

사전 처리기 블록은 언어 구문과 관련이 없습니다. 따라서 전처리 블록은 변수 정의의 범위에 영향을 미치지 않는다는 말이 맞습니다.

나는 Greg Hewgill에 동의합니다 - 나는 전에 이런 일을 본 적이 있습니다.

또한 디버거가 사용중인 어셈블리를 찾아 반사판으로 열 수 있습니다. 해부는 실제로 무슨 일이 일어나고 있는지에 대한 더 나은 아이디어를 제공해야합니다.

이와 같은 것에 직면하면 어셈블리 수준에서보십시오.

어셈블리는 요즘 거의 코딩하지 않을 것입니다. 필요합니다 이와 같은 미스터리를 추적하는 것을 알고 있습니다.

일이 낯선 사람과 낯선 사람이됩니다. 위의 제안을 수행하고 리플렉터와 디버거가 제공 한 분해를 통해 코드를 검토했습니다. 둘 다 예상대로 보입니다. 변수의 "마술"변경을 명확하게 보여주기 위해 코드를 약간 수정했습니다.

새로운 코드는입니다

int initialKeyCount;
#if(DEBUG)
//          int initialKeyCount = _root.CountAllKeys();
      initialKeyCount = 20000;
      initialKeyCount++;
      initialKeyCount = initialKeyCount;
#endif
      currNode = currNode.EnsureDegreeKeysPresent(parent);
#if(DEBUG)
      int currentKeyCount = _root.CountAllKeys();
      Debug.Assert(initialKeyCount == currentKeyCount,
               string.Format("EnsureDegreeNodesPresent changed the node count from {0} to {1}.", initialKeyCount, currentKeyCount));
#endif

위의 분해는입니다

int initialKeyCount;
#if(DEBUG)
//          int initialKeyCount = _root.CountAllKeys();
      initialKeyCount = 20000;
00000094  mov         dword ptr [ebp-50h],4E20h 
      initialKeyCount++;
0000009b  inc         dword ptr [ebp-50h] 
      initialKeyCount = initialKeyCount;
0000009e  nop              
#endif
      currNode = currNode.EnsureDegreeKeysPresent(parent);
0000009f  mov         edx,dword ptr [ebp-48h] 
...

메모리 창을 사용하여 IP가있을 때 EBP-0X50에서 값을 보았습니다.

00000094 at 값은 0x0입니다
0000009b에서 값은 0x4E20입니다
at 0000009e 값은 0x4E21입니다
at 0000009f 값은 0x4E01입니다

어셈블리 코드를 작성한 이래로 오랜 시간이 걸렸지 만 NOP가 메모리에 글을 쓰지 않아야한다고 확신합니다. :)

분명히 일부 코드는 디버거가 표시되지 않도록 실행 중입니다. 내가 이것을 일으키는 사전 프로세서를 어떻게 사용했는지에 대해 무언가가 있는지 아는 사람이 있습니까? 아니면 단순히 버그입니까?

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