2014-05-18 2 views
2

CreateProcess을 통해 기본 Windows 프로그램에서로드되는 cygwin gcc 컴파일 프로세스를 디버깅합니다. 예를 들어 메인 앞에 중단 점을 설정하고 싶습니다. mainCRTStartup.아직 시작되지 않은 프로세스에 gdb를 사용하여 연결

아직로드되지 않은 프로세스에 연결하고 중단 점을 설정하는 방법 mainCRTStartup?

이 중요한 경우, 그것의하지 XY 문제. Windows 2012 R2에서 발생할 수있는 버그를 분석 중이며 CreateProcess 호출에서로드 된 프로세스의 기본 진입 점까지 전달 된 전체 명령 줄을 추적해야합니다. MS에 접근하기 전에 문제가있는 곳을 확실히 알아야합니다.

또한 WinDBG가 cygwin gcc 컴파일 바이너리를 디버깅 할 수 없기 때문에 gdb를 사용해야합니다. 내가 GFLAGS를 사용

노력이 무엇

, 나는 "너무 긴 파일 이름을"이미지로드가,하지만 불행히도, 메시지와 함께 인사를 할 때 어느 GDB를 호출하기 위해 노력하고 어떤없이 GDB를 호출 active process

이 접근법의 문제점은 gflags가 이미지 이름 뒤에 명령 줄 매개 변수가있는 디버거를 호출하는 것입니다. 여기서 gdb는 명령 줄 매개 변수없이 PID 또는 이미지 이름을 필요로합니다. 참조 How to attach a process in gdb

+0

어떻게 존재하지 않는 프로세스에 * 아무것도 * 할 것인가? 그것은 매우 간단합니다. 당신은 할 수 없습니다. 그리고 왜 우리가 그렇게하고 싶어하는지 말해 주실 수 있습니까? ([XY 문제] (http://meta.stackoverflow.com/questions/66377/what-is-the-xy-problem)에 대해 읽어보십시오. –

+0

@JoachimPileborg : 'XY 문제'가 아닙니다. Windows 2012 R2에서 발생할 수있는 버그를 분석하고 CreateProcess 호출에서 주 진입 점까지 전달 된 전체 명령 줄을 추적해야합니다. MS에 접근하기 전에 문제가있는 곳을 확실히 알아야합니다. – Abhijit

+0

당신은 우리가 왜 당신이하고 싶은 일을하고 싶었는지, 현 솔루션을 어떻게 작동시키는 지 알고 싶다고 말하지 않았습니다. 그래서 실제로 XY 문제입니다. 이제 우리는 최소한 당신이하고 싶은 것을 알고 있으며 지식이있는 사람은 원하는 솔루션이 가능하거나 다른 솔루션 (아무도 할 수 없었던 마지막)이 있는지 말할 수 있습니다. –

답변

0

디버거가 실행될 때마다 자동으로 특정 프로세스가 실행되도록 Windows에 지시 할 수 있습니다. 이것은 유형의 레지스트리 값 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\<whatever.exe>\Debugger을 작성하여 디버거로 사용할 gdb 실행 파일의 전체 경로/이름을 포함합니다.

참고 :

  1. http://msdn.microsoft.com/en-us/library/a329t4ed(vs.71).aspx
  2. http://bugslasher.net/2011/03/26/how-to-debug-a-process-as-soon-as-it-starts-with-windbg-or-visual-studio-2010/
+0

gflags를 사용하여 비슷한 것을 시도했지만 "파일 이름이 너무 깁니다"라는 메시지가 표시되고 활성 프로세스없이 gdb를 호출하는 것으로 믿습니다 :-( – Abhijit

+0

이 방법의 문제점은, gflags는 이미지 이름 뒤에 명령 줄 매개 변수가있는 디버거를 호출합니다. 여기서 gdb는 명령 줄 매개 변수가없는 PID 또는 이미지 이름을 나타냅니다. [gdb에서 프로세스 연결 방법] (http://stackoverflow.com/ 질문/14370972/how-to-attach-a-process-in-gdb) – Abhijit

0

글쎄, 당신은 실제로이 작업을 수행 할 수 있습니다, 나는 생각한다. 당신이 기꺼이 노력한다면.

단계 : 1) 여기에 설명 된대로 cygwin1.dll의 복사본을 직접 만드십시오. http://cygwin.com/faq.html#faq.programming.building-cygwin. 구성 할 때 "--enable-debugging"플래그를 추가하십시오. 여기에 설명 된대로

2 ), 자신의 복사본으로 기존 cygwin1.dll 교체 : https://cygwin.com/faq.html#faq.setup.snapshots는 (분명히 당신이 타르 물건을하지 않습니다 환경 변수 CYGWIN_DEBUG = 설정))

3 곳이다 디버깅하려는 프로그램의 이름. Cygwin은 기본적으로 여기에 "contains"메소드를 사용합니다.

1) --enable-디버깅 스위치가 당신의 애플 리케이션을 만들 것입니다 : 그래서, 그것은 GDB 세션에게 당신이 그 이름이 변수 당신 CYGWIN_DEBUG

주의 사항에 넣어 문자열을 포함하는 프로그램을 실행하려고 언제 시작됩니다 매우 천천히 달리며 완전히 안정되지는 않습니다.

는 여기를 참조하십시오 : http://cygwin.com/ml/cygwin/2014-05/msg00316.html

관련 문제