2010-01-06 4 views
4

디버거를 최적으로 사용하려면 어셈블리 언어를 반드시 배워야합니까? 디버깅 세션 중에이 암호 코드와 CPU 레지스터를 보았습니다 ... (eax ... blah blah). 어셈블리라고 가정하고 어떻게 든 문제의 원인을 해독해야합니다.기본 C++ 디버깅 질문

어셈블리 언어를 배우지 않고도 디버거를 이해할 수있는 지름길이 있습니까?

추신 : 나는 거의 1000 페이지에 달하는 조립에 관한 책을 보았고, 위를 통과 할 책이 ​​없습니다. 도와주세요.
편집 됨 : **** codeBlocks ide를 사용 중입니다. 하지만 질문은 여전히 ​​MSVC++을 의미합니다.

+2

컴파일 할 때'-g' 옵션을 전달 했습니까? http://cs.baylor.edu/~donahoo/tools/gdb/tutorial.html – notnoop

+0

적어도 개발 환경 및 디버거에 대해 언급하는 것이 도움이 될 것입니다. –

+0

예 배우기는 어렵지만 개선 될 것입니다. 그냥 훈련으로 생각하십시오. – toto

답변

11

때때로 디버깅 중에 일부 ASM 지식이 매우 유용 할 수 있지만, 아마도 귀하의 경우에 더 유용한 것은 디버깅 기호를 바로 얻으려고입니다.

gcc의 경우에는 -g 플래그를 전달하십시오. Visual Studio 컴파일러의 경우 프로젝트 설정에서 디버깅 기호 생성 (예 : 릴리스 빌드의 경우에도)을 사용합니다. 다른 컴파일러를 사용하고 있다면 해당 주제에 대한 설명서를 읽으십시오.

그리고 Windows에서 사용하는 경우에는 바이너리에 대한 디버깅 기호를 다운로드하는 것이 좋습니다. 을 많이 사용하면이 더 쉬워 질 수 있습니다. 유닉스에 microsoft site

5

컨트롤 소스가 디버그 정보가 없거나 디버그 정보로 빌드되지 않은 라이브러리에 컨트롤과 같은 소리가 들렸습니다.

최소한 컴퓨터의 아키텍처와 어셈블리 언어에 익숙하면 도움이 될 수 있지만 디버거를 제대로 사용하는 것은 반드시 필요한 것은 아닙니다.

0

효과적인 디버깅을 수행하기 위해 어셈블러를 이해할 필요는 없습니다. 어셈블리 코드에 대해 걱정할 필요가있는 것은 최적화 문제가있을 때 뿐이지 만,보다 효율적인 어셈블러 루틴을 시도하고 코딩하는 것보다 상위 레벨 코드를 다루는 것이 더 좋습니다.

0

사용중인 플랫폼이 무엇입니까? VS2010은 디버깅 경험을 크게 향상시킵니다.

+0

디버깅 용 베타 소프트웨어를 제안 하시겠습니까? Duh ... –

+0

첫째, * 디버깅 경험을 향상시키는 방법, 두 번째, 실제 질문과 어떻게 관련이 있습니까? VS2008은 C++ 코드를 완벽하게 디버깅 할 수 있으므로 2010 년은 다른면에서 더 좋을 수도 있지만 OP가 요구하는 특정 문제는 2010 년 이전에 해결되었습니다. – jalf

+0

글쎄, C++, C++ CLI 및 C#을 함께 사용합니다. 내 현재의 디버깅 경험은 끔찍합니다. 베타 때 VS2010을 기대하고 있습니다. –

1

비주얼 Windows에서 Studio 또는 Data Display Debugger 당신이 디버그 기호와 함께 컴파일 제공 아주 괜찮은 일을 할 것입니다, 당신은 어셈블러의 지식없이 당신의 C++ 코드를 단계별로하자 : 여기를 확인해보세요. 현재 사용하고있는 머신 아키텍처에 익숙하다면, asm 구문에 대한 기본적인 이해와 C++이 어떻게 매핑되어 있는지를 통해 훨씬 더 많은 것을 얻을 수 있습니다.

0

C++에는 디버깅을 돕기 위해 메타 데이터를 저장하는 응용 프로그램이 필요하지 않습니다. 그런 메타 데이터를 찾을 수 없다면 디버거는별로 쓸 일이 없습니다. 보이는 것은 실행중인 기계 코드이므로 평범한 어셈블리 코드를 보여 주기만하면됩니다.

그러나 컴파일러는 일반적으로 디버거에서 사용할 수있는 디버그 정보를 작성할 수 있습니다. 이것은 기본적으로 컴파일러에게 소스 코드가 어떻게 보이는지 (또는 소스 파일을 찾을 수있는 곳)와 소스 코드의 어떤 라인과 일치 하는지를 알려주며 작성한 실제 C++ 코드를 디버깅 할 수있게합니다.

사용하는 컴파일러 나 디버거를 지정하지 않았으므로 특정 경우에이를 사용하는 방법을 설명 할 수 없습니다.

GCC에서 GDB 용 디버그 정보를 생성하기 위해 내가 기억할 수있는 한 -g으로 컴파일해야합니다. 단지 대부분의 경우에 작동합니다 Visual Studio에서

2

예 (당신이 "빈 C++ 프로젝트"를 시작하면 나는 생각하지만, 당신은 프로젝트 속성에서 디버그 정보 자신을 활성화해야합니다). 최적의 디버깅을 위해서는 프로세서가 말하는 언어 이상인 어셈블리를 이해해야합니다.

무서운 것은 아닙니다. 프로그래밍 언어는 어셈블리보다 간단하지 않습니다.

+0

프로그래밍 언어는 어셈블리보다 훨씬 간단하고 훨씬 더 읽기 쉽습니다. 그들은 더 기본적인 것을 얻지 못합니다. –

+3

David : 어셈블리가 정말 간단하다고 생각합니다. 모든 의미가 명시 적이며 매뉴얼에 기록되어 있습니다. 숨겨진 VM이 없으며 컴파일러를 다시 작성하지 않아도됩니다. 나에게 충분히 단순 해 보입니다. –

2

어셈블리 전문가 일 필요는 없지만 어셈블리 코드를 이해하면 디버깅에 중요합니다. this one과 같은 자습서의 "필요한 어셈블리 만"을 찾아보십시오.