GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing github.com — gh-135953: Profile a module or script with sampling profiler by lkollar · Pull Request #136777 · python/cpython Conversation
|
|
🤖 New build scheduled with the buildbot fleet by @pablogsal for commit 1bf048a 🤖 Results will be shown at: https://buildbot.python.org/all/#/grid?branch=refs%2Fpull%2F136777%2Fmerge If you want to schedule another build, you need to add the 🔨 test-with-buildbots label again. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
This PR extends the sampling profiler to support profiling modules and scripts by launching them in subprocesses, in addition to the existing PID-based profiling. The change improves the usability of the profiler by allowing users to profile Python programs from startup rather than only attaching to existing processes.
-m and script filename arguments as mutually exclusive alternatives to the existing -p PID optionCopilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
| Lib/profile/sample.py | Adds argument parsing for module and script modes, implements subprocess launching and management |
| Lib/test/test_sample_profiler.py | Updates existing CLI tests to use -p flag and adds comprehensive test coverage for new module/script functionality |
Lib/test/test_sample_profiler.py:1637
contextlib.chdir() to change directories for module discovery, but doesn't test the case where the module is not found or the directory change fails. Consider adding a test case for module resolution errors. contextlib.chdir(tempdir.name),
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| if not(args.pid or args.module or args.script): | ||
| parser.error( | ||
| "You must specify either a process ID (-p), a module (-m), or a script to run." | ||
| ) |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
The condition not(args.pid or args.module or args.script) is redundant since the mutually exclusive group is already marked as required=True. The argparse library will automatically enforce that one of these options is provided.
| if not(args.pid or args.module or args.script): | |
| parser.error( | |
| "You must specify either a process ID (-p), a module (-m), or a script to run." | |
| ) | |
| # The mutually exclusive group already enforces that one of these arguments is required. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| process = subprocess.Popen(cmd) | ||
|
|
||
| try: | ||
| exit_code = process.wait(timeout=0.1) |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
The hardcoded timeout of 0.1 seconds is a magic number. Consider defining this as a named constant or making it configurable, as some programs may have longer startup times.
| exit_code = process.wait(timeout=0.1) | |
| exit_code = process.wait(timeout=DEFAULT_PROCESS_WAIT_TIMEOUT) |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| if process.poll() is None: | ||
| process.terminate() | ||
| try: | ||
| process.wait(timeout=2) |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
Thanks @AA-Turner, I think I addressed all your comments. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
Add `-m` and `filename` arguments to the sampling profiler to launch the specified Python program in a subprocess and start profiling it. Previously only a PID was accepted, this can now be done by passing `-p PID`.
These args are already mutually exclusive, but we need to check if at least on module argument has been passed.
In this case the subprocess will go into zombie state until we can poll it. We can simply assume this is the case if it's still detected as running when we get a ValueError.
Improve the return value check to be able to raise a ProcessLookupError when the remote process is not available. Mach uses composite error values where higher error values indicate specific subsystems. We can use the err_get_code function to mask the higher bits to make our error checking more robust in case the subsystem bits are set. For example, in some situations if the process is in zombie state, we can get KERN_NO_SPACE (0x3) but the actual return value is 0x10000003 which indicates a specific subsystem, thus we need to use err_get_code to extract the error value. This also improves how KERN_INVALID_ARGUMENT is handled to check whether we got a generic invalid argument error, or if the process is no longer accessible.
758af04 to
289d868
Compare
289d868 to
0338ee1
Compare
|
🤖 New build scheduled with the buildbot fleet by @pablogsal for commit 0338ee1 🤖 Results will be shown at: https://buildbot.python.org/all/#/grid?branch=refs%2Fpull%2F136777%2Fmerge If you want to schedule another build, you need to add the 🔨 test-with-buildbots label again. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
@lkollar Seems |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
|
why is the |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
|
Oh, I think this is because we are sampling before the other process calls |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
a7fa762 to
2576f8b
Compare
e40aa09 to
3847fff
Compare
|
🤖 New build scheduled with the buildbot fleet by @pablogsal for commit 3847fff 🤖 Results will be shown at: https://buildbot.python.org/all/#/grid?branch=refs%2Fpull%2F136777%2Fmerge If you want to schedule another build, you need to add the 🔨 test-with-buildbots label again. |
Sorry, something went wrong.
There was an error while loading. Please reload this page.
* main: pythongh-137288: Update 3.14 magic numbers (pythonGH-137665) pythongh-135228: When @DataClass(slots=True) replaces a dataclass, make the original class collectible (take 2) (pythonGH-137047) pythongh-126008: Improve docstrings for Tkinter cget and configure methods (pythonGH-133303) pythongh-131885: Use positional-only markers for ``max()`` and ``min()`` (python#131868) pythonGH-137426: Remove code deprecation of `importlib.abc.ResourceLoader` (pythonGH-137567) pythongh-125897: Mark range function parameters as positional only (python#125945) pythongh-137400: Fix a crash when disabling profiling across all threads (pythongh-137471) pythongh-115766: Fix IPv4Interface.is_unspecified (pythonGH-137326) pythongh-128813: cleanup C-API docs for PyComplexObject (pythonGH-137579) pythongh-135953: Profile a module or script with sampling profiler (python#136777) Fix documentation of hash in PyHash_FuncDef (python#137595)
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
There was an error while loading. Please reload this page.