11function ! vebugger#mdbg#searchAndAttach (binaryFile,srcpath)
2- let l: processId= vebugger#util#selectProcessOfFile (a: binaryFile )
3- if 0 <l: processId
4- call vebugger#mdbg#start (a: binaryFile ,{' srcpath' :a: srcpath ,' pid' :l: processId })
5- endif
2+ let l: processId= vebugger#util#selectProcessOfFile (a: binaryFile )
3+ if 0 <l: processId
4+ call vebugger#mdbg#start (a: binaryFile ,{' srcpath' :a: srcpath ,' pid' :l: processId })
5+ endif
66endfunction
77
88function ! vebugger#mdbg#start (binaryFile,args )
9- let l: debugger= vebugger#std#startDebugger (shellescape (vebugger#util#getToolFullPath (' mdbg' ,get (a: args ,' version' ),' Mdbg' )))
10- let l: debugger .state .mdbg= {' breakpointNumbers' :{}}
11- let l: debugger .readResultTemplate.mdbg= {' breakpointBound' :{}}
12-
13- if has_key (a: args ,' srcpath' )
14- let l: debugger .state .mdbg.srcpath= a: args .srcpath
15- else
16- let l: debugger .state .mdbg.srcpath= ' .'
17- endif
9+ let l: debugger= vebugger#std#startDebugger (shellescape (vebugger#util#getToolFullPath (' mdbg' ,get (a: args ,' version' ),' Mdbg' )))
10+ let l: debugger .state .mdbg= {' breakpointNumbers' :{}}
11+ let l: debugger .readResultTemplate.mdbg= {' breakpointBound' :{}}
1812
19- call l: debugger .writeLine (' when StepComplete do where' )
20- call l: debugger .writeLine (' when BreakpointHit do where' )
13+ if has_key (a: args ,' srcpath' )
14+ let l: debugger .state .mdbg.srcpath= a: args .srcpath
15+ else
16+ let l: debugger .state .mdbg.srcpath= ' .'
17+ endif
2118
19+ call l: debugger .writeLine (' when StepComplete do where' )
20+ call l: debugger .writeLine (' when BreakpointHit do where' )
2221
23- if get (a: args ,' pid' ) " Attach to process
24- call l: debugger .writeLine (' attach ' .string (a: args .pid))
25- else
26- if ! get (a: args ,' noConsole' )
27- call l: debugger .writeLine (' mode nc on' )
28- endif
29- call l: debugger .writeLine (' run "' .s: pathToMdbgStyle (fnamemodify (a: binaryFile , ' :p' )).' " ' .vebugger#util#commandLineArgsForProgram (a: args ))
30- call l: debugger .writeLine (' where' )
31- end
32- call l: debugger .addReadHandler (function (' s:readProgramOutput' ))
33- call l: debugger .addReadHandler (function (' s:readWhere' ))
34- call l: debugger .addReadHandler (function (' s:readFinish' ))
35- call l: debugger .addReadHandler (function (' s:readEvaluatedExpressions' ))
36- call l: debugger .addReadHandler (function (' s:readBreakpointBound' ))
3722
38- call l: debugger .addThinkHandler (function (' s:breakpointAdded' ))
23+ if get (a: args ,' pid' ) " Attach to process
24+ call l: debugger .writeLine (' attach ' .string (a: args .pid))
25+ else
26+ if ! get (a: args ,' noConsole' )
27+ call l: debugger .writeLine (' mode nc on' )
28+ endif
29+ call l: debugger .writeLine (' run "' .s: pathToMdbgStyle (fnamemodify (a: binaryFile , ' :p' )).' " ' .vebugger#util#commandLineArgsForProgram (a: args ))
30+ call l: debugger .writeLine (' where' )
31+ end
32+ call l: debugger .addReadHandler (function (' s:readProgramOutput' ))
33+ call l: debugger .addReadHandler (function (' s:readWhere' ))
34+ call l: debugger .addReadHandler (function (' s:readFinish' ))
35+ call l: debugger .addReadHandler (function (' s:readEvaluatedExpressions' ))
36+ call l: debugger .addReadHandler (function (' s:readBreakpointBound' ))
3937
40- call l: debugger .setWriteHandler (' std' ,' flow' ,function (' s:writeFlow' ))
41- call l: debugger .setWriteHandler (' std' ,' breakpoints' ,function (' s:writeBreakpoints' ))
42- call l: debugger .setWriteHandler (' std' ,' closeDebugger' ,function (' s:closeDebugger' ))
43- call l: debugger .setWriteHandler (' std' ,' evaluateExpressions' ,function (' s:requestEvaluateExpression' ))
44- call l: debugger .setWriteHandler (' std' ,' executeStatements' ,function (' s:executeStatements' ))
38+ call l: debugger .addThinkHandler (function (' s:breakpointAdded' ))
4539
46- call l: debugger .generateWriteActionsFromTemplate ()
40+ call l: debugger .setWriteHandler (' std' ,' flow' ,function (' s:writeFlow' ))
41+ call l: debugger .setWriteHandler (' std' ,' breakpoints' ,function (' s:writeBreakpoints' ))
42+ call l: debugger .setWriteHandler (' std' ,' closeDebugger' ,function (' s:closeDebugger' ))
43+ call l: debugger .setWriteHandler (' std' ,' evaluateExpressions' ,function (' s:requestEvaluateExpression' ))
44+ call l: debugger .setWriteHandler (' std' ,' executeStatements' ,function (' s:executeStatements' ))
4745
48- call l: debugger .std_addAllBreakpointActions ( g: vebugger_breakpoints )
46+ call l: debugger .generateWriteActionsFromTemplate ( )
4947
50- return l: debugger
48+ call l: debugger .std_addAllBreakpointActions (g: vebugger_breakpoints )
49+
50+ return l: debugger
5151endfunction
5252
5353function ! s: pathToMdbgStyle (path )
@@ -67,133 +67,133 @@ function! s:pathToVimStyle(path)
6767endfunction
6868
6969function ! s: findFilePath (src ,fileName,methodName)
70- let l: fileName = s: pathToVimStyle (a: fileName )
71- if vebugger#util#isPathAbsolute (l: fileName )
72- return fnamemodify (l: fileName ,' :p' ) " Return the normalized full path
70+ let l: fileName = s: pathToVimStyle (a: fileName )
71+ if vebugger#util#isPathAbsolute (l: fileName )
72+ return fnamemodify (l: fileName ,' :p' ) " Return the normalized full path
73+ endif
74+ let l: path= fnamemodify (a: src ,' :p' )
75+ let l: files= glob (l: path .' **/' .l: fileName ,0 ,1 )
76+ for l: dirname in split (a: methodName ,' \.' )
77+ if empty (l: files )
78+ return ' '
7379 endif
74- let l: path= fnamemodify (a: src ,' :p' )
75- let l: files= glob (l: path .' **/' .l: fileName ,0 ,1 )
76- for l: dirname in split (a: methodName ,' \.' )
77- if empty (l: files )
78- return ' '
79- endif
80- if 1 == len (l: files )
81- return l: files [0 ]
82- endif
83- let l: path= fnamemodify (l: path .l: dirname ,' :p' )
84- let l: files= filter (l: files ,' -1<stridx(v:val,l:path)' )
85- endfor
86- return ' '
80+ if 1 == len (l: files )
81+ return l: files [0 ]
82+ endif
83+ let l: path= fnamemodify (l: path .l: dirname ,' :p' )
84+ let l: files= filter (l: files ,' -1<stridx(v:val,l:path)' )
85+ endfor
86+ return ' '
8787endfunction
8888
8989function ! s: readProgramOutput (pipeName,line ,readResult,debugger)
9090endfunction
9191
9292function ! s: readWhere (pipeName,line ,readResult,debugger)
93- if ' out' == a: pipeName
94- let l: matches= matchlist (a: line ,' \v^\*(\d+)\.\s*([A-Za-z0-9_.+<>]+)\s*\((.+):(\d+)\)' )
95- if 3 <len (l: matches )
96- let l: frameNumber= str2nr (l: matches [1 ])
97- let l: file= s: findFilePath (a: debugger .state .mdbg.srcpath,l: matches [3 ],l: matches [2 ])
98- let l: file= fnamemodify (l: file ,' :~:.' )
99- if 0 == l: frameNumber " first stackframe is the current location
100- let a: readResult .std.location= {
101- \' file ':(l: file ),
102- \' line ': str2nr (l: matches [4 ])}
103- endif
104- let a: readResult .std.callstack= {
105- \' clearOld' :(' 0 '== l: frameNumber ),
106- \' add ' :' after',
107- \' file ':(l: file ),
108- \' line ': str2nr (l: matches [4 ])}
109- endif
93+ if ' out' == a: pipeName
94+ let l: matches= matchlist (a: line ,' \v^\*(\d+)\.\s*([A-Za-z0-9_.+<>]+)\s*\((.+):(\d+)\)' )
95+ if 3 <len (l: matches )
96+ let l: frameNumber= str2nr (l: matches [1 ])
97+ let l: file= s: findFilePath (a: debugger .state .mdbg.srcpath,l: matches [3 ],l: matches [2 ])
98+ let l: file= fnamemodify (l: file ,' :~:.' )
99+ if 0 == l: frameNumber " first stackframe is the current location
100+ let a: readResult .std.location= {
101+ \' file ':(l: file ),
102+ \' line ': str2nr (l: matches [4 ])}
103+ endif
104+ let a: readResult .std.callstack= {
105+ \' clearOld' :(' 0 '== l: frameNumber ),
106+ \' add ' :' after',
107+ \' file ':(l: file ),
108+ \' line ': str2nr (l: matches [4 ])}
110109 endif
110+ endif
111111endfunction
112112
113113function ! s: readFinish (pipeName,line ,readResult,debugger)
114- if a: line= ~' \VSTOP: Process Exited\$'
115- let a: readResult .std.programFinish= {' finish' :1 }
116- endif
114+ if a: line= ~' \VSTOP: Process Exited\$'
115+ let a: readResult .std.programFinish= {' finish' :1 }
116+ endif
117117endfunction
118118
119119function ! s: writeFlow (writeAction,debugger)
120- if ' stepin' == a: writeAction
121- call a: debugger .writeLine (' step' )
122- elseif ' stepover' == a: writeAction
123- call a: debugger .writeLine (' next' )
124- elseif ' stepout' == a: writeAction
125- call a: debugger .writeLine (' out' )
126- elseif ' continue' == a: writeAction
127- call a: debugger .writeLine (' go' )
128- endif
120+ if ' stepin' == a: writeAction
121+ call a: debugger .writeLine (' step' )
122+ elseif ' stepover' == a: writeAction
123+ call a: debugger .writeLine (' next' )
124+ elseif ' stepout' == a: writeAction
125+ call a: debugger .writeLine (' out' )
126+ elseif ' continue' == a: writeAction
127+ call a: debugger .writeLine (' go' )
128+ endif
129129endfunction
130130
131131function ! s: closeDebugger (writeAction,debugger)
132- call a: debugger .writeLine (' quit' )
132+ call a: debugger .writeLine (' quit' )
133133endfunction
134134
135135function ! s: writeBreakpoints (writeAction,debugger)
136- for l: breakpoint in a: writeAction
137- let l: fullFileName= fnamemodify (l: breakpoint .file ,' :p' )
138- if ' add' == (l: breakpoint .action)
139- call a: debugger .writeLine (' break ' .s: pathToMdbgStyle (l: fullFileName ).' :' .l: breakpoint .line )
140- let a: debugger .state .mdbg.breakpointNumbers[s: pathToVimStyle (l: fullFileName ).' :' .l: breakpoint .line ]= {}
141- elseif ' remove' == l: breakpoint .action
142- call a: debugger .writeLine (' delete ' .a: debugger .state .mdbg.breakpointNumbers[l: fullFileName .' :' .l: breakpoint .line ].number )
143- call remove (a: debugger .state .mdbg.breakpointNumbers,l: fullFileName .' :' .l: breakpoint .line )
144- endif
145- endfor
136+ for l: breakpoint in a: writeAction
137+ let l: fullFileName= fnamemodify (l: breakpoint .file ,' :p' )
138+ if ' add' == (l: breakpoint .action)
139+ call a: debugger .writeLine (' break ' .s: pathToMdbgStyle (l: fullFileName ).' :' .l: breakpoint .line )
140+ let a: debugger .state .mdbg.breakpointNumbers[s: pathToVimStyle (l: fullFileName ).' :' .l: breakpoint .line ]= {}
141+ elseif ' remove' == l: breakpoint .action
142+ call a: debugger .writeLine (' delete ' .a: debugger .state .mdbg.breakpointNumbers[l: fullFileName .' :' .l: breakpoint .line ].number )
143+ call remove (a: debugger .state .mdbg.breakpointNumbers,l: fullFileName .' :' .l: breakpoint .line )
144+ endif
145+ endfor
146146endfunction
147147
148148function ! s: readBreakpointBound (pipeName,line ,readResult,debugger)
149- if ' out' == a: pipeName
150- let l: matches= matchlist (a: line ,' \vBreakpoint \#(\d+) bound\s*\(line (\d+) in ([^)]+)\)' )
151- if 3 <len (l: matches )
152- let a: readResult .mdbg.breakpointBound= {
153- \' fileNameTail':s: pathToVimStyle (l: matches [3 ]),
154- \' line ':l: matches [2 ],
155- \' breakpointNumber':l: matches [1 ]}
156- endif
149+ if ' out' == a: pipeName
150+ let l: matches= matchlist (a: line ,' \vBreakpoint \#(\d+) bound\s*\(line (\d+) in ([^)]+)\)' )
151+ if 3 <len (l: matches )
152+ let a: readResult .mdbg.breakpointBound= {
153+ \' fileNameTail':s: pathToVimStyle (l: matches [3 ]),
154+ \' line ':l: matches [2 ],
155+ \' breakpointNumber':l: matches [1 ]}
157156 endif
157+ endif
158158endfunction
159159
160160function ! s: breakpointAdded (readResult,debugger)
161- if ! empty (a: readResult .mdbg.breakpointBound)
162- let l: breakpointBound= a: readResult .mdbg.breakpointBound
163- let l: lookFor= l: breakpointBound .fileNameTail.' :' .l: breakpointBound .line
164- let l: lookForRegex= ' \V' .escape (l: lookFor ,' \' ).' \$'
165- let l: matchingKeys= filter (keys (a: debugger .state .mdbg.breakpointNumbers),' v:val=~l:lookForRegex' )
166- for l: key in l: matchingKeys
167- if empty (a: debugger .state .mdbg.breakpointNumbers[l: key ])
168- let a: debugger .state .mdbg.breakpointNumbers[l: key ]= {' number' :l: breakpointBound .breakpointNumber}
169- endif
170- endfor
171- endif
161+ if ! empty (a: readResult .mdbg.breakpointBound)
162+ let l: breakpointBound= a: readResult .mdbg.breakpointBound
163+ let l: lookFor= l: breakpointBound .fileNameTail.' :' .l: breakpointBound .line
164+ let l: lookForRegex= ' \V' .escape (l: lookFor ,' \' ).' \$'
165+ let l: matchingKeys= filter (keys (a: debugger .state .mdbg.breakpointNumbers),' v:val=~l:lookForRegex' )
166+ for l: key in l: matchingKeys
167+ if empty (a: debugger .state .mdbg.breakpointNumbers[l: key ])
168+ let a: debugger .state .mdbg.breakpointNumbers[l: key ]= {' number' :l: breakpointBound .breakpointNumber}
169+ endif
170+ endfor
171+ endif
172172endfunction
173173
174174function ! s: requestEvaluateExpression (writeAction,debugger)
175- for l: evalAction in a: writeAction
176- call a: debugger .writeLine (' print ' .l: evalAction .expression )
177- endfor
175+ for l: evalAction in a: writeAction
176+ call a: debugger .writeLine (' print ' .l: evalAction .expression )
177+ endfor
178178endfunction
179179
180180function ! s: executeStatements (writeAction,debugger)
181- for l: evalAction in a: writeAction
182- if has_key (l: evalAction ,' statement' )
183- call a: debugger .writeLine (' set ' .substitute (l: evalAction .statement ,' \v;\s*$' ,' ' ,' ' ))
184- endif
185- endfor
181+ for l: evalAction in a: writeAction
182+ if has_key (l: evalAction ,' statement' )
183+ call a: debugger .writeLine (' set ' .substitute (l: evalAction .statement ,' \v;\s*$' ,' ' ,' ' ))
184+ endif
185+ endfor
186186endfunction
187187
188188function ! s: readEvaluatedExpressions (pipeName,line ,readResult,debugger) dict
189- if ' out' == a: pipeName
190- let l: matches= matchlist (a: line ,' \v\[[^\]]*\]\s*mdbg\>\s*([^=]+)\=(.*)$' )
191- if 2 <len (l: matches )
192- let l: expression= l: matches [1 ]
193- let l: value= l: matches [2 ]
194- let a: readResult .std.evaluatedExpression= {
195- \' expression ':l: expression ,
196- \' value':l: value }
197- endif
189+ if ' out' == a: pipeName
190+ let l: matches= matchlist (a: line ,' \v\[[^\]]*\]\s*mdbg\>\s*([^=]+)\=(.*)$' )
191+ if 2 <len (l: matches )
192+ let l: expression= l: matches [1 ]
193+ let l: value= l: matches [2 ]
194+ let a: readResult .std.evaluatedExpression= {
195+ \' expression ':l: expression ,
196+ \' value':l: value }
198197 endif
198+ endif
199199endfunction
0 commit comments