winedbg
모든 창 핸들 목록을 제공하는 다음 명령이 있습니다 .
$ winedbg --command "info wnd"
Window handle Class Name Style WndProc Thread Text
00010020 #32769 96000000 00000000 00000022 -- Empty --
006c02e4 tooltips_class32 84800000 00000000 00000115 -- Empty --
00270280 tooltips_class32 84800001 00000000 00000115 -- Empty --
002101a6 tooltips_class32 84800001 00000000 000000d6 -- Empty --
001700c4 tooltips_class32 84800000 00000000 000000d6 -- Empty --
019a02ca ComboLBox 44808041 00000000 00000115 -- Empty --
00700040 tooltips_class32 94800000 00000000 000000d6 -- Empty --
004106c8 tooltips_class32 84800001 00000000 00000115 -- Empty --
008f0172 tooltips_class32 84800000 00000000 00000115 -- Empty --
007402a8 ComboLBox 44808041 00000000 00000115 -- Empty --
003807de MetaQuotes::MetaT 14cf8000 00000000 00000115 1809640: MetaT
00230782 msctls_statusbar3 5400014e 00000000 00000115 -- Empty --
000f0670 AfxControlBar140s 56002800 00000000 00000115 Standard
003b065a Static 50000100 00000000 00000115 -- Empty --
00110678 ToolbarWindow32 5400186e 00000000 00000115 Timeframes
0050069a ToolbarWindow32 5400186e 00000000 00000115 Line Studies
001f06ac ToolbarWindow32 5400186e 00000000 00000115 Charts
001706b2 ToolbarWindow32 5400186e 00000000 00000115 Standard
001d05e2 AfxControlBar140s 56008200 00000000 00000115 Tester
001a048e Afx:00400000:b:00 56000000 00000000 00000115 Terminal
002c0118 Shell Embedding 56010000 00000000 00000115 Shell Embeddin
00900386 nsAppShell:EventW 04c00000 00000000 00000115 nsAppShell:Eve
07bf01c4 nsAppShell:EventW 04c00000 00000000 000000d6 nsAppShell:Eve
terminal.exe
특정 프로세스( / ) 에 속하는 창 핸들만 포함하도록 이 목록을 필터링하고 싶지만 000000ce
, 문제는 위 목록에 pid 목록이 없고(그래서 가능함 grep
) 내 프로세스에 33개의 서로 다른 스레드가 있다는 것입니다.
$ winedbg --command "info proc"
pid threads executable (all id:s are in hex)
000000ce 33 'terminal.exe'
0000002b 8 'rpcss.exe'
00000021 4 'explorer.exe'
0000000e 5 'services.exe'
0000001a 3 \_ 'plugplay.exe'
00000012 4 \_ 'winedevice.exe'
사용 가능한 단계는 다음과 같은 방식으로 나열될 수 있습니다(가독성을 위해 일부 단계가 제거되었습니다).
$ winedbg --command "info thread"
process tid prio (all id:s are in hex)
0000000e services.exe
0000011a 0
0000001d 0
00000014 0
00000010 0
0000000f 0
000000ce terminal.exe
000000de 0
0000013a 0
0000004f 0
00000115 0
특정 프로세스에 속하는 창 핸들만 포함하도록 창 핸들 목록을 필터링하는 가장 간단한 방법은 무엇입니까?
내가 모르는 특별한 옵션이 있습니까? 아니면 pid->thread->wnd ID를 일치시키기 위해 몇 줄의 구문 분석 스크립트가 필요합니까 grep
?
답변1
선택한 핸들을 나열하는 명령은 다음과 같습니다( terminal.exe
응용 프로그램 이름으로 대체됨).
$ winedbg --command "info wnd" | grep -wf <(winedbg --command "info threads" | ex +"/terminal.exe\n\zs/;,/^\S/-p" -scq! /dev/stdin | awk '{print $1}' )
기본적으로 우리는 특정 스레드 목록을 통해 grep
모든 창 처리기() 목록을 얻습니다 . info wnd
목록은 ex
출력을 기반으로 편집기에서 구문 분석되고 info threads
( )에 의해 로드된 특수 파일( )에 저장됩니다. awk 명령은 스레드 ID를 나열하는 첫 번째 열을 인쇄합니다./dev/fd
grep
-f
사용법 구문 지침 ex
:
+"cmd"
- 명령을 실행/terminal.exe\n\zs/;,/^\S/-p
/pattern1/;,/pattern2/
- 범위 검색(;
첫 번째 패턴 뒤에 커서를 놓습니다)/terminal.exe\n\zs/
-terminal.exe
시작점 검색 및 표시 (\zs
)/^\S/
- 공백이 아닌 첫 번째 줄에서 선택이 끝납니다.-p
-위의 선택 항목에서 한 줄을 빼고 인쇄합니다(관련우편 엽서)-scq!
-에스묵묵하고 강압적으로 (!
) 실행큐그것씨주문하다/dev/stdin
- 표준 입력에서 읽기