* Provide a single notification when a breakpoint is hit. #805 (#922) * Provide a single notification when a breakpoint is hit. #805 ptvsd requires all threads to be stopped or all threads to be running (this is a limitation for vsts), so, we generate a single notification when a breakpoint is hit and have CMD_GET_THREAD_STACK wait to get the actual stack (or if the thread is not paused in a timely manner, provide the stack as it is, but in this case it may not be possible to get the locals or interact with the frame -- issued commands will timeout). * Rename CMD_SUSPEND_ON_BREAKPOINT_EXCEPTION to CMD_PYDEVD_JSON_CONFIG. * Fixes to ptvsd tests related to differences of thread events after changes to PyDBCommandThread. * Make ptvsd use CMD_THREAD_SUSPEND_SINGLE_NOTIFICATION and CMD_THREAD_RESUME_SINGLE_NOTIFICATION. * Fixing tests. * Sleep on wait_for_attach() (should be removed later) -- it seems there's still a racing condition as wait_for_attach() seems to proceed before CMD_PYDEVD_JSON_CONFIG is passed on to pydevd. * Test changes needed to integrate 805 (#969) * Integrate 805 initial * Fix send suspend event to use single suspend event command * Fix thread run event tests. * Fix event ordering * fix reattach tests * Increase timeouts for some tests. * Fix more tests * fix typo * Skip flaky/redundent re-attach tests * more cleanup * Replace completions tests with pytests * Ensure continued is sent when the thread runs. * Dont wait for continued in completions tests. * Revert "Ensure continued is sent when the thread runs." This reverts commit caef558fcf4d890d01bf3e5694b3dbc42795aaaf. * Skip broken tests. * Parametrize completion tests |
||
|---|---|---|
| .github/ISSUE_TEMPLATE | ||
| debugger_protocol | ||
| ptvsd | ||
| pytests | ||
| tests | ||
| win | ||
| .flake8 | ||
| .flake8.ci | ||
| .gitattributes | ||
| .gitignore | ||
| .pylintrc | ||
| .travis.yml | ||
| CODE_OF_CONDUCT.md | ||
| CONTRIBUTING.md | ||
| DESCRIPTION.md | ||
| LICENSE | ||
| Makefile | ||
| MANIFEST.in | ||
| ptvsd.code-workspace | ||
| pytest.ini | ||
| README.md | ||
| setup.cfg | ||
| setup.py | ||
| test_requirements.txt | ||
| tox.ini | ||
| versioneer.py | ||
Python Tools for Visual Studio debug server
ptvsd CLI Usage
Debugging a script file
To run a script file with debugging enabled, but without waiting for the debugger to attach (i.e. code starts executing immediately):
-m ptvsd --host localhost --port 5678 myfile.py
To wait until the debugger attaches before running your code, use the --wait switch.
-m ptvsd --host localhost --port 5678 --wait myfile.py
The --host option specifies the interface on which the debug server is listening for connections. To be able to attach from another machine, make sure that the server is listening on a public interface - using 0.0.0.0 will make it listen on all available interfaces:
-m ptvsd --host 0.0.0.0 --port 5678 myfile.py
This should only be done on secure networks, since anyone who can connect to the specified port can then execute arbitrary code within the debugged process.
To pass arguments to the script, just specify them after the filename. This works the same as with Python itself - everything up to the filename is processed by ptvsd, but everything after that becomes sys.argv of the running process.
Debugging a module
To run a module, use the -m switch instead of filename:
-m ptvsd --host localhost --port 5678 -m mymodule
Same as with scripts, command line arguments can be passed to the module by specifying them after the module name. All other ptvsd switches work identically in this mode; in particular, --wait can be used to block execution until debugger attaches.
Attaching to a running process by ID
The following command injects the debugger into a process with a given PID that is running Python code. Once the command returns, a ptvsd server is running within the process, as if that process was launched via -m ptvsd itself.
-m ptvsd --host localhost --port 5678 --pid 12345
ptvsd Import usage
Enabling debugging
At the beginning of your script, import ptvsd, and call ptvsd.enable_attach() to start the debug server. The default hostname is 0.0.0.0, and the default port is 5678; these can be overridden by passing a (host, port) tuple as the first argument of enable_attach().
import ptvsd
ptvsd.enable_attach()
...
Waiting for debugger to attach
Use the ptvsd.wait_for_attach() function to block program execution until debugger is attached.
import ptvsd
ptvsd.enable_attach()
ptvsd.wait_for_attach() # blocks execution until debugger is attached
...
breakpoint() function
In Python 3.7 and above, ptvsd supports the standard breakpoint() function. Use ptvsd.break_into_debugger() function for similar behavior and compatibility with older versions of Python (3.6 and below). If the debugger is attached when either of these functions are invoked, it will pause execution on the calling line, as if it had a breakpoint set. If there's no debugger attached, the functions do nothing, and code continues to execute normally.
import ptvsd
ptvsd.enable_attach()
while True:
...
breakpoint() # or ptvsd.break_into_debugger() on <3.7
...
Custom Protocol arguments
Launch request arguments
{
"debugOptions": [
"RedirectOutput", // Whether to redirect stdout and stderr (see pydevd_comm.CMD_REDIRECT_OUTPUT)
"WaitOnNormalExit", // Wait for user input after user code exits normally
"WaitOnAbnormalExit", // Wait for user input after user code exits with error
"Django", // Enables Django Template debugging
"Jinja", // Enables Jinja (Flask) Template debugging
"FixFilePathCase", // See FIX_FILE_PATH_CASE in wrapper.py
"DebugStdLib", // Whether to enable debugging of standard library functions
"StopOnEntry", // Whether to stop at first line of user code
"ShowReturnValue", // Show return values of functions
]
}
Attach request arguments
{
"debugOptions": [
"RedirectOutput", // Whether to redirect stdout and stderr (see pydevd_comm.CMD_REDIRECT_OUTPUT)
"Django", // Enables Django Template debugging
"Jinja", // Enables Jinja (Flask) Template debugging
"FixFilePathCase", // See FIX_FILE_PATH_CASE in wrapper.py
"DebugStdLib", // Whether to enable debugging of standard library functions
"WindowsClient", // Whether client OS is Windows
"UnixClient", // Whether client OS is Unix
"ShowReturnValue", // Show return values of functions
],
"pathMappings": [
{
"localRoot": "C:\\Project\\src", // Local root (where source and debugger running)
"remoteRoot": "/home/smith/proj" // Remote root (where remote code is running)
},
// Add more path mappings
]
}