개인적으로는 디버거를 만들려면 운영체제보다는 CPU 아키텍쳐와 바이너리 포맷에서 빠삭해야 한다고 생각합니다.
세상에는 MMU를 탑재하지 않은 프로세서가 존재하고, MMU를 탑재한다고 하더라도 그것을 이용하지 않는 OS도 많습니다. 주로 임베디드겠죠.
하지만, 그런 환경에서도 디버깅은 해야합니다.
실제로 gdb같은 경우 OS가 존재하지 않는 임베디드 환경에서도 GDB remote serial protocol만 구현해 주변 디버깅할 수 있습니다.
브레이크 포인트를 지정하는 경우를 예로 들자면, 유저가 소스 코드의 어떤 장소에 브레이크 포인트를 지정했을 때, 해당 주소에 있던 명령을 디버거가 관리하는 메모리에 백업해 둔 후, 그 자리에는 소프트웨어 인터럽트를 발생시키는 명령을 써 버립니다. 그리고, 프로그램을 돌려서 Program Counter가 그 위치에 도달하면 인터럽트가 발생하겠죠. 그러면 백업해둔 메모리 내용을 가지고 원래 있어야 할 명령으로 복구시킵니다.
(모든 디버거가 브레이크 기능을 다 이렇게 구현하였다는 얘기는 아닙니다. 하드웨어 브레이크 포인트를 지원하는 CPU 아키텍쳐에서는 좀 더 쉽게 구현할 수도 있을 것입니다.)
심볼을 참조하여 메모리를 조사할 경우(변수명 등)에는 디버거가 심볼 정보를 읽어들여야 할 필요가 있고, gcc에서 -g 옵션을 붙이는 이유는 그 때문이죠.
스택, 레지스터는 그냥 해당 레지스터 값만 알면 볼 수 있죠.
운영체제를 공부하시면됩니다.
말그대로 입니다.
운영체제를 공부하시고 운영체제가 제공하는 API의 체계를 공부하시면 됩니다.
올리디버거도 결국은 운영체제의 api를 이용하는 어플리케이션에 불과하니까요..
물론 원리를 이해하려면 윈도우즈 운영체제의 동작원리에 대해서 알아야겠지만요?
흔한 말로는 리버싱을 공부하면 말씀하시는 영역에 도달하는것으로 알고있습니다.
---------------------------------------------------------------
Opensource에 기여하는 것이 꿈입니다.
내가 만든 코드를 모두가 사용할 때 까지~
그럼 모든 메모리의 내용을 읽을 수 있나요???
운영체제 공부할 때, 메모리 영역이(가상 메모리) 운영체제 영역, 응용프로그램 영역 등등으로 나누어져 있는 걸로 아는데, 메모리를 보는 것에 대한 권한이 필요하든지 보안 때문에 못 읽도록 되어있는 메모리 영역은 없는 건가요???
어쨌든 운영체제를 공부하세요
어쨌든 운영체제를 공부하세요
피할 수 있을때 즐겨라! http://melotopia.net/b
..
제가 쓸려던 글을 써주셨군요..
왜 어쨋든 운영체제를 공부해야 하는지는 운영체제를 공부해보시면 알게됩니다....
개인적으로는 디버거를 만들려면 운영체제보다는 CPU
개인적으로는 디버거를 만들려면 운영체제보다는 CPU 아키텍쳐와 바이너리 포맷에서 빠삭해야 한다고 생각합니다.
세상에는 MMU를 탑재하지 않은 프로세서가 존재하고, MMU를 탑재한다고 하더라도 그것을 이용하지 않는 OS도 많습니다. 주로 임베디드겠죠.
하지만, 그런 환경에서도 디버깅은 해야합니다.
실제로 gdb같은 경우 OS가 존재하지 않는 임베디드 환경에서도 GDB remote serial protocol만 구현해 주변 디버깅할 수 있습니다.
http://www.embecosm.com/appnotes/ean4/embecosm-howto-rsp-server-ean4-issue-2.html
브레이크 포인트를 지정하는 경우를 예로 들자면, 유저가 소스 코드의 어떤 장소에 브레이크 포인트를 지정했을 때, 해당 주소에 있던 명령을 디버거가 관리하는 메모리에 백업해 둔 후, 그 자리에는 소프트웨어 인터럽트를 발생시키는 명령을 써 버립니다. 그리고, 프로그램을 돌려서 Program Counter가 그 위치에 도달하면 인터럽트가 발생하겠죠. 그러면 백업해둔 메모리 내용을 가지고 원래 있어야 할 명령으로 복구시킵니다.
(모든 디버거가 브레이크 기능을 다 이렇게 구현하였다는 얘기는 아닙니다. 하드웨어 브레이크 포인트를 지원하는 CPU 아키텍쳐에서는 좀 더 쉽게 구현할 수도 있을 것입니다.)
심볼을 참조하여 메모리를 조사할 경우(변수명 등)에는 디버거가 심볼 정보를 읽어들여야 할 필요가 있고, gcc에서 -g 옵션을 붙이는 이유는 그 때문이죠.
스택, 레지스터는 그냥 해당 레지스터 값만 알면 볼 수 있죠.
생산적인 댓글을 달자
댓글 달기