pystack 1.6.0__tar.gz → 1.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. {pystack-1.6.0 → pystack-1.7.0}/.bumpversion.cfg +1 -1
  2. pystack-1.7.0/.clang-format +97 -0
  3. pystack-1.7.0/.gitattributes +2 -0
  4. pystack-1.7.0/.gitignore +167 -0
  5. {pystack-1.6.0 → pystack-1.7.0}/.pre-commit-config.yaml +8 -8
  6. pystack-1.7.0/CMakeLists.txt +24 -0
  7. {pystack-1.6.0 → pystack-1.7.0}/MANIFEST.in +0 -1
  8. {pystack-1.6.0 → pystack-1.7.0}/NEWS.rst +21 -0
  9. {pystack-1.6.0 → pystack-1.7.0}/PKG-INFO +12 -18
  10. {pystack-1.6.0 → pystack-1.7.0}/README.md +6 -4
  11. pystack-1.7.0/news/.gitignore +1 -0
  12. {pystack-1.6.0 → pystack-1.7.0}/pyproject.toml +84 -18
  13. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/__init__.py +2 -2
  14. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/__main__.py +12 -12
  15. pystack-1.7.0/src/pystack/_pystack/CMakeLists.txt +71 -0
  16. pystack-1.7.0/src/pystack/_pystack/bindings.cpp +1117 -0
  17. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/corefile.cpp +2 -2
  18. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/corefile.h +1 -1
  19. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/code.h +0 -39
  20. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/frame.h +15 -18
  21. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/gc.h +0 -23
  22. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/interpreter.h +0 -77
  23. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/runtime.h +225 -14
  24. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/thread.h +0 -67
  25. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/elf_common.h +1 -1
  26. pystack-1.7.0/src/pystack/_pystack/interpreter.cpp +34 -0
  27. pystack-1.7.0/src/pystack/_pystack/interpreter.h +24 -0
  28. pystack-1.7.0/src/pystack/_pystack/logging.cpp +135 -0
  29. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/logging.h +4 -1
  30. pystack-1.7.0/src/pystack/_pystack/maps_parser.cpp +363 -0
  31. pystack-1.7.0/src/pystack/_pystack/maps_parser.h +44 -0
  32. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/mem.cpp +11 -48
  33. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/mem.h +21 -23
  34. pystack-1.7.0/src/pystack/_pystack/native_frame.cpp +33 -0
  35. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/native_frame.h +5 -0
  36. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/process.cpp +180 -16
  37. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/process.h +29 -7
  38. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pyframe.cpp +23 -3
  39. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pythread.cpp +55 -2
  40. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pythread.h +2 -0
  41. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pytypes.cpp +1 -3
  42. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/structure.h +4 -4
  43. pystack-1.7.0/src/pystack/_pystack/thread_builder.cpp +207 -0
  44. pystack-1.7.0/src/pystack/_pystack/thread_builder.h +75 -0
  45. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/unwinder.cpp +21 -4
  46. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/unwinder.h +1 -1
  47. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/version.cpp +157 -22
  48. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/version.h +1 -0
  49. pystack-1.7.0/src/pystack/_pystack/version_detector.cpp +203 -0
  50. pystack-1.7.0/src/pystack/_pystack/version_detector.h +22 -0
  51. pystack-1.7.0/src/pystack/_pystack.pyi +96 -0
  52. pystack-1.7.0/src/pystack/_version.py +1 -0
  53. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/errors.py +24 -6
  54. pystack-1.7.0/src/pystack/maps.py +79 -0
  55. pystack-1.7.0/src/pystack/process.py +58 -0
  56. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/traceback_formatter.py +51 -22
  57. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/types.py +5 -6
  58. pystack-1.7.0/valgrind.supp +66 -0
  59. pystack-1.6.0/Makefile +0 -156
  60. pystack-1.6.0/setup.cfg +0 -4
  61. pystack-1.6.0/setup.py +0 -147
  62. pystack-1.6.0/src/pystack/_pystack/CMakeLists.txt +0 -26
  63. pystack-1.6.0/src/pystack/_pystack/__init__.pxd +0 -0
  64. pystack-1.6.0/src/pystack/_pystack/corefile.pxd +0 -55
  65. pystack-1.6.0/src/pystack/_pystack/elf_common.pxd +0 -22
  66. pystack-1.6.0/src/pystack/_pystack/logging.cpp +0 -29
  67. pystack-1.6.0/src/pystack/_pystack/logging.pxd +0 -2
  68. pystack-1.6.0/src/pystack/_pystack/mem.pxd +0 -33
  69. pystack-1.6.0/src/pystack/_pystack/native_frame.pxd +0 -11
  70. pystack-1.6.0/src/pystack/_pystack/process.pxd +0 -41
  71. pystack-1.6.0/src/pystack/_pystack/pycode.pxd +0 -17
  72. pystack-1.6.0/src/pystack/_pystack/pyframe.pxd +0 -19
  73. pystack-1.6.0/src/pystack/_pystack/pythread.pxd +0 -37
  74. pystack-1.6.0/src/pystack/_pystack.pyi +0 -62
  75. pystack-1.6.0/src/pystack/_pystack.pyx +0 -782
  76. pystack-1.6.0/src/pystack/_version.py +0 -1
  77. pystack-1.6.0/src/pystack/maps.py +0 -327
  78. pystack-1.6.0/src/pystack/process.py +0 -180
  79. pystack-1.6.0/src/pystack.egg-info/PKG-INFO +0 -310
  80. pystack-1.6.0/src/pystack.egg-info/SOURCES.txt +0 -78
  81. pystack-1.6.0/src/pystack.egg-info/dependency_links.txt +0 -1
  82. pystack-1.6.0/src/pystack.egg-info/entry_points.txt +0 -2
  83. pystack-1.6.0/src/pystack.egg-info/top_level.txt +0 -1
  84. {pystack-1.6.0 → pystack-1.7.0}/LICENSE +0 -0
  85. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/compat.h +0 -0
  86. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/dict.h +0 -0
  87. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/float.h +0 -0
  88. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/int.h +0 -0
  89. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/list.h +0 -0
  90. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/object.h +0 -0
  91. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/pthread.h +0 -0
  92. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/string.h +0 -0
  93. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/cpython/tuple.h +0 -0
  94. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/elf_common.cpp +0 -0
  95. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pycode.cpp +0 -0
  96. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pycode.h +0 -0
  97. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pycompat.h +0 -0
  98. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pyframe.h +0 -0
  99. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/_pystack/pytypes.h +0 -0
  100. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/colors.py +0 -0
  101. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/engine.py +0 -0
  102. {pystack-1.6.0 → pystack-1.7.0}/src/pystack/py.typed +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 1.6.0
2
+ current_version = 1.7.0
3
3
  commit = True
4
4
  message =
5
5
  Prepare for {new_version} release
@@ -0,0 +1,97 @@
1
+ BasedOnStyle: LLVM
2
+ Language: Cpp
3
+ AccessModifierOffset: -2
4
+ AlignAfterOpenBracket: AlwaysBreak
5
+ AlignConsecutiveAssignments: false
6
+ AlignConsecutiveDeclarations: false
7
+ AlignEscapedNewlines: Right
8
+ AlignOperands: true
9
+ AlignTrailingComments: false
10
+ AllowAllArgumentsOnNextLine: false
11
+ AllowAllParametersOfDeclarationOnNextLine: false
12
+ AllowShortBlocksOnASingleLine: false
13
+ AllowShortCaseLabelsOnASingleLine: false
14
+ AllowShortFunctionsOnASingleLine: None
15
+ AllowShortIfStatementsOnASingleLine: WithoutElse
16
+ AllowShortLoopsOnASingleLine: false
17
+ AlwaysBreakAfterReturnType: TopLevel
18
+ AlwaysBreakBeforeMultilineStrings: false
19
+ AlwaysBreakTemplateDeclarations: Yes
20
+ BinPackArguments: false
21
+ BinPackParameters: false
22
+ BraceWrapping:
23
+ AfterClass: true
24
+ AfterControlStatement: MultiLine
25
+ AfterEnum: false
26
+ AfterFunction: true
27
+ AfterNamespace: false
28
+ AfterStruct: true
29
+ AfterUnion: false
30
+ AfterExternBlock: false
31
+ BeforeCatch: false
32
+ BeforeElse: false
33
+ IndentBraces: false
34
+ SplitEmptyFunction: true
35
+ SplitEmptyRecord: true
36
+ SplitEmptyNamespace: true
37
+ BreakBeforeBinaryOperators: NonAssignment
38
+ BreakBeforeBraces: Custom
39
+ BreakBeforeInheritanceComma: false
40
+ BreakBeforeTernaryOperators: true
41
+ BreakConstructorInitializers: BeforeComma
42
+ BreakInheritanceList: BeforeComma
43
+ BreakStringLiterals: true
44
+ ColumnLimit: 105
45
+ CompactNamespaces: false
46
+ ConstructorInitializerAllOnOneLineOrOnePerLine: false
47
+ ConstructorInitializerIndentWidth: 0
48
+ ContinuationIndentWidth: 8
49
+ Cpp11BracedListStyle: true
50
+ DerivePointerAlignment: false
51
+ FixNamespaceComments: true
52
+ IncludeBlocks: Preserve
53
+ IncludeCategories:
54
+ - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
55
+ Priority: 2
56
+ - Regex: '^(<|"(gtest|gmock|isl|json)/)'
57
+ Priority: 3
58
+ - Regex: ".*"
59
+ Priority: 1
60
+ IndentCaseLabels: true
61
+ IndentGotoLabels: false
62
+ IndentPPDirectives: AfterHash
63
+ IndentWidth: 4
64
+ IndentWrappedFunctionNames: false
65
+ KeepEmptyLinesAtTheStartOfBlocks: false
66
+ MaxEmptyLinesToKeep: 1
67
+ NamespaceIndentation: None
68
+ PenaltyBreakAssignment: 2
69
+ PenaltyBreakBeforeFirstCallParameter: 19
70
+ PenaltyBreakComment: 300
71
+ PenaltyBreakFirstLessLess: 120
72
+ PenaltyBreakString: 1000
73
+ PenaltyBreakTemplateDeclaration: 10
74
+ PenaltyExcessCharacter: 1000000
75
+ PenaltyReturnTypeOnItsOwnLine: 60
76
+ PointerAlignment: Left
77
+ ReflowComments: true
78
+ SortIncludes: true
79
+ SortUsingDeclarations: true
80
+ SpaceAfterCStyleCast: false
81
+ SpaceAfterTemplateKeyword: false
82
+ SpaceBeforeAssignmentOperators: true
83
+ SpaceBeforeCpp11BracedList: false
84
+ SpaceBeforeCtorInitializerColon: true
85
+ SpaceBeforeInheritanceColon: true
86
+ SpaceBeforeParens: ControlStatements
87
+ SpaceBeforeRangeBasedForLoopColon: true
88
+ SpaceInEmptyParentheses: false
89
+ SpacesBeforeTrailingComments: 2
90
+ SpacesInAngles: false
91
+ SpacesInContainerLiterals: true
92
+ SpacesInCStyleCastParentheses: false
93
+ SpacesInParentheses: false
94
+ SpacesInSquareBrackets: false
95
+ Standard: Auto
96
+ TabWidth: 8
97
+ UseTab: Never
@@ -0,0 +1,2 @@
1
+ # Normalize line-endings for all text files.
2
+ * text=auto
@@ -0,0 +1,167 @@
1
+ # IDE stuff
2
+
3
+ .idea/*
4
+
5
+ # Cmake stuff
6
+
7
+ CMakeLists.txt.user
8
+ CMakeCache.txt
9
+ CMakeFiles
10
+ CMakeScripts
11
+ Testing
12
+ Makefile
13
+ cmake_install.cmake
14
+ install_manifest.txt
15
+ compile_commands.json
16
+ CTestTestfile.cmake
17
+ _deps
18
+ *.cbp
19
+ cmake-build-*/
20
+
21
+ # pip stuff
22
+ pip-wheel-metadata/
23
+
24
+ # Cython specific files
25
+ src/pystack/*.cpp
26
+ src/pystack/_pystack_api.h
27
+
28
+ # Byte-compiled / optimized / DLL files
29
+ __pycache__/
30
+ *.py[cod]
31
+ *$py.class
32
+
33
+ # C extensions
34
+ *.so
35
+
36
+ # Distribution / packaging
37
+ .Python
38
+ build/
39
+ develop-eggs/
40
+ dist/
41
+ downloads/
42
+ eggs/
43
+ .eggs/
44
+ lib/
45
+ lib64/
46
+ parts/
47
+ sdist/
48
+ var/
49
+ wheels/
50
+ share/python-wheels/
51
+ *.egg-info/
52
+ .installed.cfg
53
+ *.egg
54
+ MANIFEST
55
+
56
+ # PyInstaller
57
+ # Usually these files are written by a python script from a template
58
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
59
+ *.manifest
60
+ *.spec
61
+
62
+ # Installer logs
63
+ pip-log.txt
64
+ pip-delete-this-directory.txt
65
+
66
+ # Unit test / coverage reports
67
+ htmlcov/
68
+ .tox/
69
+ .nox/
70
+ .coverage
71
+ .coverage.*
72
+ .cache
73
+ nosetests.xml
74
+ coverage.xml
75
+ *.cover
76
+ *.py,cover
77
+ .hypothesis/
78
+ .pytest_cache/
79
+ cover/
80
+ pystack-coverage
81
+ *coverage.lcov
82
+
83
+ # Translations
84
+ *.mo
85
+ *.pot
86
+
87
+ # Django stuff:
88
+ *.log
89
+ local_settings.py
90
+ db.sqlite3
91
+ db.sqlite3-journal
92
+
93
+ # Flask stuff:
94
+ instance/
95
+ .webassets-cache
96
+
97
+ # Scrapy stuff:
98
+ .scrapy
99
+
100
+ # Sphinx documentation
101
+ docs/_build/
102
+
103
+ # PyBuilder
104
+ .pybuilder/
105
+ target/
106
+
107
+ # Jupyter Notebook
108
+ .ipynb_checkpoints
109
+
110
+ # IPython
111
+ profile_default/
112
+ ipython_config.py
113
+
114
+ # pyenv
115
+ # For a library or package, you might want to ignore these files since the code is
116
+ # intended to run in multiple environments; otherwise, check them in:
117
+ # .python-version
118
+
119
+ # pipenv
120
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
121
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
122
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
123
+ # install all needed dependencies.
124
+ #Pipfile.lock
125
+
126
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
127
+ __pypackages__/
128
+
129
+ # Celery stuff
130
+ celerybeat-schedule
131
+ celerybeat.pid
132
+
133
+ # SageMath parsed files
134
+ *.sage.py
135
+
136
+ # Environments
137
+ .env
138
+ .venv
139
+ env/
140
+ venv/
141
+ ENV/
142
+ env.bak/
143
+ venv.bak/
144
+
145
+ # Spyder project settings
146
+ .spyderproject
147
+ .spyproject
148
+
149
+ # Rope project settings
150
+ .ropeproject
151
+
152
+ # mkdocs documentation
153
+ /site
154
+
155
+ # mypy
156
+ .mypy_cache/
157
+ .dmypy.json
158
+ dmypy.json
159
+
160
+ # Pyre type checker
161
+ .pyre/
162
+
163
+ # pytype static type analyzer
164
+ .pytype/
165
+
166
+ # Cython debug symbols
167
+ cython_debug/
@@ -1,6 +1,6 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v4.4.0
3
+ rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
4
4
  hooks:
5
5
  - id: check-added-large-files
6
6
  - id: check-json
@@ -12,41 +12,41 @@ repos:
12
12
  exclude: "^[.]bumpversion[.]cfg"
13
13
 
14
14
  - repo: https://github.com/pre-commit/pygrep-hooks
15
- rev: v1.10.0
15
+ rev: 3a6eb0fadf60b3cccfd80bad9dbb6fae7e47b316 # frozen: v1.10.0
16
16
  hooks:
17
17
  - id: rst-directive-colons
18
18
  - id: rst-inline-touching-normal
19
19
 
20
20
  - repo: https://github.com/charliermarsh/ruff-pre-commit
21
- rev: "v0.0.262"
21
+ rev: "5e2fb545eba1ea9dc051f6f962d52fe8f76a9794" # frozen: v0.15.13
22
22
  hooks:
23
23
  - id: ruff
24
24
  args: [--fix, --exit-non-zero-on-fix]
25
25
  stages: [pre-commit]
26
26
 
27
27
  - repo: https://github.com/psf/black
28
- rev: 23.3.0
28
+ rev: 87928e6d6761a4a6d22250e1fee5601b3998086e # frozen: 26.5.1
29
29
  hooks:
30
30
  - id: black
31
31
 
32
32
  - repo: https://github.com/pycqa/isort
33
- rev: 5.12.0
33
+ rev: dac090ce4d9ee313d086e2e89ab1acb8c2664fa1 # frozen: 9.0.0a3
34
34
  hooks:
35
35
  - id: isort
36
36
  exclude_types: [python]
37
37
 
38
38
  - repo: https://github.com/sphinx-contrib/sphinx-lint
39
- rev: v0.6.7
39
+ rev: c883505f64b59c3c5c9375191e4ad9f98e727ccd # frozen: v1.0.2
40
40
  hooks:
41
41
  - id: sphinx-lint
42
42
 
43
43
  - repo: https://github.com/executablebooks/mdformat/
44
- rev: 0.7.16
44
+ rev: 82912cdaea4fb830f751504486a7879c70526547 # frozen: 1.0.0
45
45
  hooks:
46
46
  - id: mdformat
47
47
 
48
48
  - repo: https://github.com/pre-commit/mirrors-clang-format
49
- rev: v16.0.2
49
+ rev: dd18dad857d6133e90bbe478f4f2f22ec0030269 # frozen: v22.1.5
50
50
  hooks:
51
51
  - id: clang-format
52
52
  args: [--Werror, -i]
@@ -0,0 +1,24 @@
1
+ cmake_minimum_required(VERSION 3.17...3.27)
2
+
3
+ project(pystack LANGUAGES CXX)
4
+
5
+ set(CMAKE_CXX_STANDARD 20)
6
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
7
+ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
8
+
9
+ # Find Python
10
+ find_package(Python 3.9 COMPONENTS Interpreter Development.Module REQUIRED)
11
+
12
+ # Find nanobind
13
+ execute_process(
14
+ COMMAND "${Python_EXECUTABLE}" -m nanobind --cmake_dir
15
+ OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE nanobind_ROOT)
16
+ find_package(nanobind CONFIG REQUIRED)
17
+
18
+ # Find libelf and libdw via pkg-config
19
+ find_package(PkgConfig REQUIRED)
20
+ pkg_check_modules(LIBELF REQUIRED libelf)
21
+ pkg_check_modules(LIBDW REQUIRED libdw)
22
+
23
+ # Add the extension module subdirectory
24
+ add_subdirectory(src/pystack/_pystack)
@@ -3,7 +3,6 @@ exclude CONTRIBUTING.md
3
3
  exclude Dockerfile
4
4
  exclude src/pystack/*.cpp
5
5
  exclude src/pystack/*.h
6
- exclude requirements-*.txt
7
6
  exclude tox.ini
8
7
  exclude valgrind.supp
9
8
 
@@ -8,6 +8,27 @@ Changelog
8
8
 
9
9
  .. towncrier release notes start
10
10
 
11
+ pystack 1.7.0 (2026-07-09)
12
+ --------------------------
13
+
14
+ Features
15
+ ~~~~~~~~
16
+
17
+ - Replace Cython with nanobind for Python bindings, improving performance by eliminating round-trips between Python and C++. (#272)
18
+ - Add :ref:`support for Python subinterpreters <multiple-interpreters>`. When a process uses multiple interpreters (e.g. via Python 3.14's `concurrent.interpreters` module), stacks for all interpreters are now reported instead of just the main one. (#279)
19
+ - Python 3.15 is now supported. The wheels are not yet published because the ABI is not yet frozen. (#289)
20
+ - PyStack is now built against elfutils 0.195, up from 0.193. (#315)
21
+
22
+
23
+ Bug Fixes
24
+ ~~~~~~~~~
25
+
26
+ - Fix compatibility with the Python 3.14 JIT compiler. (#277)
27
+ - Fix native mode stacks for Python 3.14's LLVM-generated ``*_TAIL_CALL_*`` frames. (#277)
28
+ - Fix ``IndexError`` in traceback formatting when the source file has fewer lines than expected. (#191)
29
+ - Fix an extra blank line sometimes being printed in the middle of a traceback. (#298)
30
+
31
+
11
32
  pystack 1.6.0 (2026-01-25)
12
33
  --------------------------
13
34
 
@@ -1,32 +1,24 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.2
2
2
  Name: pystack
3
- Version: 1.6.0
3
+ Version: 1.7.0
4
4
  Summary: Analysis of the stack of remote python processes
5
- Home-page: https://github.com/bloomberg/pystack
6
5
  Author: Pablo Galindo Salgado
6
+ License: Apache-2.0
7
7
  Classifier: Intended Audience :: Developers
8
8
  Classifier: License :: OSI Approved :: Apache Software License
9
9
  Classifier: Operating System :: POSIX :: Linux
10
- Classifier: Programming Language :: Python :: 3.8
11
10
  Classifier: Programming Language :: Python :: 3.9
12
11
  Classifier: Programming Language :: Python :: 3.10
13
12
  Classifier: Programming Language :: Python :: 3.11
14
13
  Classifier: Programming Language :: Python :: 3.12
15
14
  Classifier: Programming Language :: Python :: 3.13
16
15
  Classifier: Programming Language :: Python :: 3.14
16
+ Classifier: Programming Language :: Python :: 3.15
17
17
  Classifier: Programming Language :: Python :: Implementation :: CPython
18
18
  Classifier: Topic :: Software Development :: Debuggers
19
- Requires-Python: >=3.7.0
19
+ Project-URL: Homepage, https://github.com/bloomberg/pystack
20
+ Requires-Python: >=3.9
20
21
  Description-Content-Type: text/markdown
21
- License-File: LICENSE
22
- Dynamic: author
23
- Dynamic: classifier
24
- Dynamic: description
25
- Dynamic: description-content-type
26
- Dynamic: home-page
27
- Dynamic: license-file
28
- Dynamic: requires-python
29
- Dynamic: summary
30
22
 
31
23
  <p align="center">
32
24
  <img src="https://user-images.githubusercontent.com/11718525/226942590-de015c9a-4d5b-4960-9c42-8c1eac0845c1.png" width="70%">
@@ -58,6 +50,7 @@ PyStack has the following amazing features:
58
50
  - 🧵 Shows if each thread currently holds the Python GIL, is waiting to acquire it, or is currently
59
51
  dropping it.
60
52
  - 🗑️ Shows if a thread is running a garbage collection cycle.
53
+ - 🪆 Reports on multiple interpreters in the same process.
61
54
  - 🐍 Optionally shows native function calls, as well as Python ones. In this mode, PyStack prints
62
55
  the native stack trace (C/C++/Rust function calls), except that the calls to Python callables are
63
56
  replaced with frames showing the Python code being executed, instead of showing the internal C
@@ -114,18 +107,17 @@ cd pystack
114
107
  python3 -m venv ../pystack-env/ # just an example, put this wherever you want
115
108
  source ../pystack-env/bin/activate
116
109
  python3 -m pip install --upgrade pip
117
- python3 -m pip install -e .
118
- python3 -m pip install -r requirements-test.txt -r requirements-extra.txt
110
+ python3 -m pip install -e . --group test --group extra
119
111
  ```
120
112
 
121
113
  This will install PyStack in the virtual environment in development mode (the `-e` of the last
122
114
  `pip install` command), and then install the Python libraries needed to test it, lint it, and
123
115
  generate its documentation.
124
116
 
125
- If you plan to contribute back, you should install the pre-commit hooks:
117
+ If you plan to contribute back, you should install the prek (pre-commit) hooks:
126
118
 
127
119
  ```shell
128
- pre-commit install
120
+ prek install
129
121
  ```
130
122
 
131
123
  This will ensure that your contribution passes our linting checks.
@@ -308,3 +300,5 @@ You must use your real name (sorry, no pseudonyms, and no anonymous contribution
308
300
  - Submit the Issue.
309
301
  - Submit a Pull Request and link it to the Issue by including "#<issue number>" in the Pull Request
310
302
  summary.
303
+
304
+ Please read [CONTRIBUTING.md](./CONTRIBUTING.md) for more info.
@@ -28,6 +28,7 @@ PyStack has the following amazing features:
28
28
  - 🧵 Shows if each thread currently holds the Python GIL, is waiting to acquire it, or is currently
29
29
  dropping it.
30
30
  - 🗑️ Shows if a thread is running a garbage collection cycle.
31
+ - 🪆 Reports on multiple interpreters in the same process.
31
32
  - 🐍 Optionally shows native function calls, as well as Python ones. In this mode, PyStack prints
32
33
  the native stack trace (C/C++/Rust function calls), except that the calls to Python callables are
33
34
  replaced with frames showing the Python code being executed, instead of showing the internal C
@@ -84,18 +85,17 @@ cd pystack
84
85
  python3 -m venv ../pystack-env/ # just an example, put this wherever you want
85
86
  source ../pystack-env/bin/activate
86
87
  python3 -m pip install --upgrade pip
87
- python3 -m pip install -e .
88
- python3 -m pip install -r requirements-test.txt -r requirements-extra.txt
88
+ python3 -m pip install -e . --group test --group extra
89
89
  ```
90
90
 
91
91
  This will install PyStack in the virtual environment in development mode (the `-e` of the last
92
92
  `pip install` command), and then install the Python libraries needed to test it, lint it, and
93
93
  generate its documentation.
94
94
 
95
- If you plan to contribute back, you should install the pre-commit hooks:
95
+ If you plan to contribute back, you should install the prek (pre-commit) hooks:
96
96
 
97
97
  ```shell
98
- pre-commit install
98
+ prek install
99
99
  ```
100
100
 
101
101
  This will ensure that your contribution passes our linting checks.
@@ -278,3 +278,5 @@ You must use your real name (sorry, no pseudonyms, and no anonymous contribution
278
278
  - Submit the Issue.
279
279
  - Submit a Pull Request and link it to the Issue by including "#<issue number>" in the Pull Request
280
280
  summary.
281
+
282
+ Please read [CONTRIBUTING.md](./CONTRIBUTING.md) for more info.
@@ -0,0 +1 @@
1
+ !.gitignore
@@ -1,19 +1,88 @@
1
1
  [build-system]
2
+ requires = ["scikit-build-core>=0.4", "nanobind>=1.8"]
3
+ build-backend = "scikit_build_core.build"
2
4
 
3
- requires = [
4
- "setuptools",
5
- "wheel",
6
- "Cython",
7
- "pkgconfig"
5
+ [project]
6
+ name = "pystack"
7
+ dynamic = ["version"]
8
+ description = "Analysis of the stack of remote python processes"
9
+ readme = "README.md"
10
+ requires-python = ">=3.9"
11
+ license = {text = "Apache-2.0"}
12
+ authors = [
13
+ {name = "Pablo Galindo Salgado"}
14
+ ]
15
+ classifiers = [
16
+ "Intended Audience :: Developers",
17
+ "License :: OSI Approved :: Apache Software License",
18
+ "Operating System :: POSIX :: Linux",
19
+ "Programming Language :: Python :: 3.9",
20
+ "Programming Language :: Python :: 3.10",
21
+ "Programming Language :: Python :: 3.11",
22
+ "Programming Language :: Python :: 3.12",
23
+ "Programming Language :: Python :: 3.13",
24
+ "Programming Language :: Python :: 3.14",
25
+ "Programming Language :: Python :: 3.15",
26
+ "Programming Language :: Python :: Implementation :: CPython",
27
+ "Topic :: Software Development :: Debuggers",
28
+ ]
29
+
30
+ [dependency-groups]
31
+ docs = [
32
+ "recommonmark",
33
+ "sphinx",
34
+ "sphinx-autobuild",
35
+ "sphinx-argparse",
36
+ "furo",
37
+ ]
38
+ extra = [
39
+ "mypy",
40
+ "bump2version",
41
+ "towncrier",
42
+ "prek",
43
+ {include-group = "docs"},
44
+ ]
45
+ test = [
46
+ "coverage[toml]",
47
+ "pyinstaller",
48
+ "pytest",
49
+ "pytest-cov",
50
+ "pytest-xdist",
51
+ "setuptools",
8
52
  ]
9
53
 
10
- build-backend = 'setuptools.build_meta'
54
+ [project.urls]
55
+ Homepage = "https://github.com/bloomberg/pystack"
56
+
57
+ [project.scripts]
58
+ pystack = "pystack.__main__:main"
59
+
60
+ [tool.scikit-build]
61
+ wheel.packages = ["src/pystack"]
62
+ wheel.install-dir = "pystack"
63
+ wheel.exclude = ["pystack/_pystack/**"]
64
+ metadata.version.provider = "scikit_build_core.metadata.regex"
65
+ metadata.version.input = "src/pystack/_version.py"
66
+ sdist.include = ["src/pystack/_version.py"]
67
+ sdist.exclude = [
68
+ ".devcontainer/**",
69
+ ".github/**",
70
+ ".vscode/**",
71
+ "CONTRIBUTING.md",
72
+ "Dockerfile",
73
+ "docs/**",
74
+ "tests/**",
75
+ "uv.lock",
76
+ ]
77
+
78
+ [tool.scikit-build.cmake.define]
79
+ CMAKE_BUILD_TYPE = "Release"
11
80
 
12
81
  [tool.ruff]
13
82
  line-length = 95
14
- select = ["F", "E", "W", "I001"]
83
+ lint.select = ["F", "E", "W", "I001"]
15
84
 
16
- [tool.ruff.isort]
85
+ [tool.ruff.lint.isort]
17
86
  force-single-line = true
18
87
  known-first-party = ["pystack"]
19
88
  known-third-party=["rich", "elftools", "pytest"]
@@ -43,7 +112,7 @@ type = [
43
112
  underlines = "-~"
44
113
 
45
114
  [tool.cibuildwheel]
46
- build = ["cp38-*", "cp39-*", "cp310-*", "cp311-*"]
115
+ build = ["cp39-*", "cp310-*", "cp311-*", "cp312-*", "cp313-*", "cp314-*"]
47
116
  manylinux-x86_64-image = "manylinux2014"
48
117
  manylinux-i686-image = "manylinux2014"
49
118
  musllinux-x86_64-image = "musllinux_1_2"
@@ -51,14 +120,15 @@ skip = "*-musllinux_aarch64"
51
120
 
52
121
  [tool.cibuildwheel.linux]
53
122
  before-all = [
54
- "yum install -y libzstd-devel",
123
+ "yum install -y libzstd-devel cmake",
124
+ "yum install -y devtoolset-10-make || true", # Install a new enough GNU make on manylinux2014
55
125
  "cd /",
56
- "VERS=0.193",
126
+ "VERS=0.195",
57
127
  "curl https://sourceware.org/elfutils/ftp/$VERS/elfutils-$VERS.tar.bz2 > ./elfutils.tar.bz2",
58
128
  "tar -xf elfutils.tar.bz2",
59
129
  "cd elfutils-$VERS",
60
130
  "CFLAGS='-Wno-error -g -O3' CXXFLAGS='-Wno-error -g -O3' ./configure --disable-nls --enable-libdebuginfod=dummy --disable-debuginfod --with-zstd",
61
- "make install"
131
+ 'PATH="/opt/rh/devtoolset-10/root/usr/bin/:$PATH" make install', # Ensure we pick up gnu make 4.x on manylinux2014
62
132
  ]
63
133
 
64
134
  # Override the default linux before-all for musl linux
@@ -74,8 +144,8 @@ before-all = [
74
144
  # set the FNM_EXTMATCH macro to get the build to succeed is seen here:
75
145
  # https://git.alpinelinux.org/aports/tree/main/elfutils/musl-macros.patch
76
146
  "cd /",
77
- "apk add --update argp-standalone bison bsd-compat-headers bzip2-dev flex-dev libtool linux-headers musl-fts-dev musl-libintl musl-obstack-dev xz-dev zlib-dev zstd-dev",
78
- "VERS=0.193",
147
+ "apk add --update argp-standalone bison bsd-compat-headers bzip2-dev flex-dev libtool linux-headers musl-fts-dev musl-libintl musl-obstack-dev xz-dev zlib-dev zstd-dev cmake",
148
+ "VERS=0.195",
79
149
  "curl https://sourceware.org/elfutils/ftp/$VERS/elfutils-$VERS.tar.bz2 > ./elfutils.tar.bz2",
80
150
  "tar -xf elfutils.tar.bz2",
81
151
  "cd elfutils-$VERS",
@@ -88,16 +158,12 @@ before-all = [
88
158
  ]
89
159
 
90
160
  [tool.coverage.run]
91
- plugins = [
92
- "Cython.Coverage",
93
- ]
94
161
  source = [
95
162
  "src/pystack",
96
163
  ]
97
164
  branch = true
98
165
  parallel = true
99
166
  omit = [
100
- "stringsource",
101
167
  "tests/integration/*program*.py",
102
168
  ]
103
169
 
@@ -1,7 +1,7 @@
1
1
  from ._version import __version__
2
- from .traceback_formatter import print_thread
2
+ from .traceback_formatter import print_threads
3
3
 
4
4
  __all__ = [
5
5
  "__version__",
6
- "print_thread",
6
+ "print_threads",
7
7
  ]