@@ -195,5 +195,76 @@ the function needs to examine, starting with FILE."
195
195
:name " NetCoreDbg::Launch"
196
196
:dap-compilation " dotnet build" ))
197
197
198
+ (defun dap-netcore-debug-attach (pid )
199
+ " Attach the debugger to a .NET process with a given PID using the registered template."
200
+ (let* ((config-name " .Net Core Attach (Console)" )
201
+ (config-cell (assoc config-name dap-debug-template-configurations))
202
+ (config-plist (cdr config-cell)))
203
+ (setcdr config-cell (plist-put config-plist :processId pid))
204
+ (dap-debug (cdr config-cell))))
205
+
206
+ (defun dap-netcore-test-run (attach-buffer &optional args-string )
207
+ " Run .NET tests process to obtain PID to attach for debugging."
208
+ (with-environment-variables ((" VSTEST_HOST_DEBUG" " 1" ))
209
+ (start-process " dap-netcore-attach-process"
210
+ attach-buffer
211
+ " dotnet"
212
+ " test"
213
+ " --verbosity=Quiet"
214
+ (concat " " args-string))))
215
+
216
+ (defun dap-netcore-debug-tests-filter-pid (process output )
217
+ " Custom filter to extract PID from the process output in real-time."
218
+ (let ((buffer (process-buffer process)))
219
+ ; ; Insert the output into the buffer
220
+ (when (buffer-live-p buffer)
221
+ (with-current-buffer buffer
222
+ (let ((moving (= (point ) (process-mark process))))
223
+ (save-excursion
224
+ (goto-char (process-mark process))
225
+ (insert output)
226
+ (set-marker (process-mark process) (point )))
227
+ (if moving (goto-char (process-mark process))))))
228
+ ; ; Check for PID in the buffer
229
+ (when (buffer-live-p buffer)
230
+ (with-current-buffer buffer
231
+ (save-excursion
232
+ (goto-char (point-min ))
233
+ (when (search-forward " Process Id: " nil t )
234
+ (let ((pid-string (buffer-substring (point ) (line-end-position ))))
235
+ ; ; Debug with PID
236
+ (dap-netcore-debug-attach (string-to-number pid-string))
237
+ ; ; Remove the filter to avoid further checks
238
+ (set-process-filter process nil ))))))))
239
+
240
+ (defun dap-netcore-debug-test-init (&optional args-string )
241
+ " Prepare .NET process to attach its PID for debugging."
242
+ (let ((attach-buffer " *dap-netcore-attach*" ))
243
+ ; ; Kill existing buffer if it exists
244
+ (when (get-buffer attach-buffer)
245
+ (kill-buffer attach-buffer))
246
+ ; ; Run dotnet process
247
+ (let ((dotnet-process (dap-netcore-test-run attach-buffer args-string)))
248
+ (when dotnet-process
249
+ (set-process-filter dotnet-process #'dap-netcore-debug-tests-filter-pid )
250
+ ; ; Set process finalization event
251
+ (set-process-sentinel
252
+ dotnet-process
253
+ (lambda (process event )
254
+ (when (string-match " exited\\ |finished" event)
255
+ (message " Process exited with status: %d " (process-exit-status process))
256
+ (display-buffer attach-buffer))))))))
257
+
258
+ (defun dap-netcore-debug-test (&optional directory )
259
+ " Debug .NET tests with optional params."
260
+ (interactive )
261
+ (let ((params '())
262
+ (filter (read-string " Filter: " )))
263
+ (unless (string-empty-p filter)
264
+ (push (concat params " --filter=" filter) params))
265
+ (when directory
266
+ (push directory params))
267
+ (dap-netcore-debug-test-init (string-join (reverse params) " " ))))
268
+
198
269
(provide 'dap-netcore )
199
270
; ;; dap-netcore.el ends here
0 commit comments