2012-09-24 2 views
2

모든 프로그래밍 언어 및 도구에서 변수 값 변경시 중단 점을 설정할 수 있는지 궁금한가요?변수 값 변경시 중단 점 설정

예를 들어, 다음과 같이 말하고 싶습니다. "변수 'a'의 값이 변경되면 어디에서 멈추십시오.

변수에 특정 값이있을 때 조건 중단 점을 설정하고 실행을 중지 할 수 있다는 것을 알고 있지만 변수 변경을 관찰하는 것에 대해서는 듣지 못했습니다.

가능하지 않은 경우 이유는 무엇입니까?

+0

어떤 수준에서는 "변수가 특정 값을 취하는 경우 중지"를 구현할 수있는 경우 변수의 모든 변경 사항을 감지하고 필요한 값인지 여부를 확인하여 수행 할 수 있습니다. 그렇습니다. 이렇게 할 수있는 디버거가 있습니다. –

+0

내가 아는 바와 같이 "변수가이 코드 줄에서 특정 값을 가져올 때 중지"할 수있는 더 버그가 있지만 "변수가 모든 코드 줄에서 특정 값을 가질 때 중지"구현할 수있는 디버거가 있는지 여부는 알 수 없습니다. .... – demas

답변

2

내 경험상 "메모리 중단 점"또는 "메모리 감시 점"으로이를 달성 할 수 있습니다. 예를 들어, GDB는 이런 식으로 작업을 수행합니다 a에 관계없이 새 값이 이전 값과 동일 여부, 에 기록 될 때 Can I set a breakpoint on 'memory access' in GDB?

는 지금까지 내가 쓰기 감시 점으로 보았 듯이, 휴식이 실제로 트리거합니다. 따라서 "변경됨"으로 인해 "변경됨"을 의미하는 경우 적은 수의 예제가 있습니다. 어쩌면 아무리해도 확실하지는 않습니다. 비록 당신이 쓰기 포인트를 구현한다고 가정하면 변경 전용 시계 포인트를 구현하는 것이 기술적으로 어렵지 않을 것이라고 생각합니다.

일부 언어의 경우 어떤 종류의 변수가 달라지는가 a입니다. 예를 들어 C 또는 C++에서 최적화가 활성화되면 변수를 레지스터로 "들어 올릴"수 있습니다.이 경우 변수 주소의 하드웨어 메모리 감시 점이 모든 변경 사항을 반드시 포착하지는 않습니다.

함수가 종료되었지만 감시 점이 여전히 설정되어 있으면 다른 함수의 다른 변수에 사용되는 동일한 주소에 대한 액세스를 catch 할 수있는 스택 변수에 대한 제한 사항이 있습니다. 함수가 나중에 (또는 재귀 적으로) 다시 호출되면 동일한 스택 위치에서 시작하지 않아도되며 그렇지 않으면 감시 점이 다른 위치의 "동일한"변수에 대한 액세스를 catch하지 못합니다.

"특정 조건에서 특정 조건이 참일 때 중지"라는 것은 "조건부 중단 점"이라고 불리는 것입니다. 일반적으로 다른 메커니즘을 사용합니다. 디버거가 코드 줄에 중단 점 명령어를 넣을 가능성이 큽니다. 디버거를 트리거 할 때마다 조건을 검사하고 false이면 실행을 계속합니다.

1

일부 프로세서는 주소를 읽거나 쓸 때 깨질 하드웨어 중단 점을 지원합니다. 예를 들어 주소 0x10005060에 4 바이트 변수가 있으면 windbg를 사용하여 하드웨어 중단 점을 설정할 수 있습니다. ba w4 0x10005060. 4 바이트 중 하나라도 기록되면 프로세서가 중단됩니다. 다음 명령은 프로세서에 4 바이트 중 하나가 읽히거나 쓰여질 때 중단되도록 지시합니다. ba r4 0x10005060.