2011-09-02 4 views
4

OS X 10.6.8에서 실행중인 NPAPI 플러그인을 디버깅하고 싶습니다. FireFox 3.6.19를 사용하여로드 할 때 활성 실행 파일을 FF로 설정하고 FF를 시작한 다음 Xcode를 사용하여 연결하면 중단 점이 예상 된 시간에 실행됩니다.Safari 5.1 NPAPI 플러그인에서 XCode/GDB를 깨뜨리는 방법은 무엇입니까?

Safari 5.1을 사용할 때 플러그인이 작동하지 않는 것을 볼 수 있으므로 /System/Library/PrivateFrameworks/WebKit2.framework/PluginProcess.app에 대한 고객 실행 파일을 만들고 활성화했습니다. 그런 다음 Safari를 시작하고 플러그인을 호스팅하는 페이지로 이동 한 다음 플러그 인 프로세스에 연결 한 다음 중단 점과 같은 UI를 사용합니다.하지만 실행되지는 않습니다. 나는 UI에서 플러그가 확실히로드되었음을 알 수 있습니다. 하여 프로세스를 일시 정지, 내가 참조 :

(gdb) i b 
Num Type   Disp Enb Address What 
1 breakpoint  keep y <PENDING> "ADP_NPAPI_Interface.m":34 
2 breakpoint  keep y <PENDING> "ADP_NPAPI_Interface.m":34 
3 breakpoint  keep y <PENDING> "ADP_NPAPI_Interface.m":34 
4 breakpoint  keep y <PENDING> "plugin.cpp":244 
5 breakpoint  keep y <PENDING> "plugin.cpp":358 
6 breakpoint  keep y <PENDING> objc_exception_throw 
(gdb) show directories 
Source directories searched: $cdir:$cwd 
(gdb) info sources 
No symbol table is loaded. Use the "file" command. 
(gdb) file sources 
sources: No such file or directory 
(gdb) info file 
No registers. 
No registers. 
(gdb) show paths 
Executable and object file path: /Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin 

DEBUG_INFORMATION_FORMAT = 난쟁이 -와 - dsym. 내 이해는 기호가 플러그인에있을 것이므로 gdb가 내 소스 파일을 찾을 수 없다고 생각합니다. 당신의 도움에 미리

감사합니다, 데이브 내가 FireBreath 플러그인으로 가끔 사용했다

답변

3

한 가지 방법은 이것이다 :

진입 점 중 하나 (예 : NP_Initialize와 같은) 당신이에서 그런
#if WAIT_FOR_DEBUGGER 
static bool beingDebugged() { 
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; size_t mib_size = 4; 
    struct kinfo_proc kp; size_t kp_size = sizeof(kp); 
    int result = sysctl(mib, mib_size, &kp, &kp_size, NULL, 0); 
    return (0 == result) ? (P_TRACED & kp.kp_proc.p_flag) : false; 
} 
#endif 

:

친구가 내 생각에 올랐으며 꽤 잘 작동하는 것 같습니다. 그러나 Safari 5.1에서 브라우저는 응답을받지 못하면 (상당히 짧은 시간) 플러그인이 플러그인을 죽이게됩니다 (SIG_KILL 보내기). 이 때문에 Safari 5.1로 디버깅하는 것은 거의 불가능합니다. Firefox 나 Chrome에서 디버깅을하는 것이 좋습니다.

이렇게하면 디버거가 연결될 때까지 플러그인이 대기합니다. Safari 5.1에서는 플러그인 프로세스의 이름이 변경되었습니다. 나는 그것이 바로 지금 잊지하지만 과정에서 확실히 그리고 그것은 사파리 아니다 = 요즘]

한 나는 기본 FireBreath np_mainmain.cpp 파일이 추가로 주위거야 ....

+0

이것은 실제로 질문에 대답하지 않습니다. OP가 성공적으로 부착되었지만 기호 정보가 누락 된 경우 지시 사항은 첨부 용입니다. (또한 이런 종류의 해킹은 초기화를 디버그해야하는 경우에만 필요합니다. 그렇지 않으면 일시 중지 할 필요가없고 연결할 때까지 기다릴 필요가 없습니다.) – smorgan

+1

아, 그는 내가 대답 한 이후 추가 정보를 추가했습니다. 나는 그가 올바른 과정에 붙어 있지 않았다고 믿었다. 음, 어쨌든 누군가를위한 유용한 정보이므로 시간 낭비가되지 않았습니다. – taxilian

0

dwarf-with-dsym의 "with-dsym"부분은 심볼이 바이너리가 아닌 별도의 심볼 파일에 있음을 의미합니다.

옵션은 다음과 같습니다 -로 전환 일반 난쟁이 - 설치된 플러그인 옆에 빌드 디렉토리에서 .dsym 번들을 복사 - 수동 적어도, 나는 이것이 가능하다 생각 (GDB에서 dsym로드; I 실제로 그것을하지는 않았 음)

2

Xcode에는 실행 -> 첨부 처리 옵션이 있습니다. 이 기능을 사용하여 브라우저가 아닌 플러그인 프로세스에 연결하십시오. 여기에서 64 비트 브라우저에서 실행중인 디버깅 플러그인을 시작할 수 있습니다.

관련 문제