pystack 1.5.1__tar.gz → 1.6.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.
- {pystack-1.5.1 → pystack-1.6.0}/.bumpversion.cfg +1 -1
- {pystack-1.5.1 → pystack-1.6.0}/Makefile +1 -1
- {pystack-1.5.1 → pystack-1.6.0}/NEWS.rst +17 -0
- {pystack-1.5.1 → pystack-1.6.0}/PKG-INFO +2 -1
- {pystack-1.5.1 → pystack-1.6.0}/setup.py +1 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/elf_common.cpp +2 -2
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/process.cpp +2 -2
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/unwinder.cpp +2 -2
- pystack-1.6.0/src/pystack/_version.py +1 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack.egg-info/PKG-INFO +2 -1
- pystack-1.5.1/src/pystack/_version.py +0 -1
- {pystack-1.5.1 → pystack-1.6.0}/.pre-commit-config.yaml +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/LICENSE +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/MANIFEST.in +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/README.md +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/pyproject.toml +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/setup.cfg +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/__init__.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/__main__.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/CMakeLists.txt +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/__init__.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/compat.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/corefile.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/corefile.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/corefile.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/code.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/dict.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/float.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/frame.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/gc.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/int.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/interpreter.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/list.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/object.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/pthread.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/runtime.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/string.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/thread.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/cpython/tuple.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/elf_common.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/elf_common.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/logging.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/logging.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/logging.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/mem.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/mem.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/mem.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/native_frame.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/native_frame.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/process.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/process.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pycode.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pycode.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pycode.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pycompat.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pyframe.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pyframe.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pyframe.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pythread.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pythread.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pythread.pxd +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pytypes.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/pytypes.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/structure.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/unwinder.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/version.cpp +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack/version.h +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack.pyi +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/_pystack.pyx +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/colors.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/engine.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/errors.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/maps.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/process.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/py.typed +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/traceback_formatter.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack/types.py +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack.egg-info/SOURCES.txt +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack.egg-info/dependency_links.txt +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack.egg-info/entry_points.txt +0 -0
- {pystack-1.5.1 → pystack-1.6.0}/src/pystack.egg-info/top_level.txt +0 -0
|
@@ -71,7 +71,7 @@ valgrind: ## Run valgrind, with the correct configuration
|
|
|
71
71
|
.PHONY: ccoverage
|
|
72
72
|
ccoverage: ## Run the test suite, with C++ code coverage
|
|
73
73
|
$(MAKE) clean
|
|
74
|
-
CFLAGS="$(CFLAGS) -O0 -pg --coverage" $(MAKE) build
|
|
74
|
+
CFLAGS="$(CFLAGS) -O0 -pg --coverage" CXXFLAGS="$(CXXFLAGS) -O0 -pg --coverage" $(MAKE) build
|
|
75
75
|
$(MAKE) check
|
|
76
76
|
gcov -i build/*/src/pystack/_pystack -i -d
|
|
77
77
|
lcov --capture --directory . --output-file cppcoverage.lcov
|
|
@@ -8,6 +8,23 @@ Changelog
|
|
|
8
8
|
|
|
9
9
|
.. towncrier release notes start
|
|
10
10
|
|
|
11
|
+
pystack 1.6.0 (2026-01-25)
|
|
12
|
+
--------------------------
|
|
13
|
+
|
|
14
|
+
Features
|
|
15
|
+
~~~~~~~~
|
|
16
|
+
|
|
17
|
+
- Provide wheels for free-threaded builds of Python 3.13 (#271)
|
|
18
|
+
- Add the Python 3.14 trove classifier to our package metadata (#269)
|
|
19
|
+
- Improve some error messages and log messages (#260, #258)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Bug Fixes
|
|
23
|
+
~~~~~~~~~
|
|
24
|
+
|
|
25
|
+
- Fix handling of duplicate ``_PyRuntime`` symbols when ctypes mmaps a statically linked Python interpreter's binary in order to create a trampoline. Previously this led to "Invalid address in remote process" errors. (#258)
|
|
26
|
+
|
|
27
|
+
|
|
11
28
|
pystack 1.5.1 (2025-08-18)
|
|
12
29
|
--------------------------
|
|
13
30
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pystack
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
4
4
|
Summary: Analysis of the stack of remote python processes
|
|
5
5
|
Home-page: https://github.com/bloomberg/pystack
|
|
6
6
|
Author: Pablo Galindo Salgado
|
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
17
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
17
18
|
Classifier: Topic :: Software Development :: Debuggers
|
|
18
19
|
Requires-Python: >=3.7.0
|
|
@@ -122,6 +122,7 @@ setuptools.setup(
|
|
|
122
122
|
"Programming Language :: Python :: 3.11",
|
|
123
123
|
"Programming Language :: Python :: 3.12",
|
|
124
124
|
"Programming Language :: Python :: 3.13",
|
|
125
|
+
"Programming Language :: Python :: 3.14",
|
|
125
126
|
"Programming Language :: Python :: Implementation :: CPython",
|
|
126
127
|
"Topic :: Software Development :: Debuggers",
|
|
127
128
|
],
|
|
@@ -401,7 +401,7 @@ getSectionInfo(const std::string& filename, const std::string& section_name, Sec
|
|
|
401
401
|
LOG(DEBUG) << "Trying to locate .PyRuntime data offset from program headers";
|
|
402
402
|
file_unique_ptr file(fopen(filename.c_str(), "r"), fclose);
|
|
403
403
|
if (!file || fileno(file.get()) == -1) {
|
|
404
|
-
LOG(ERROR) << "Cannot open ELF file " << filename;
|
|
404
|
+
LOG(ERROR) << "Cannot open ELF file " << filename << " (" << std::strerror(errno) << ")";
|
|
405
405
|
return false;
|
|
406
406
|
}
|
|
407
407
|
const int fd = fileno(file.get());
|
|
@@ -559,7 +559,7 @@ getBuildId(const std::string& filename)
|
|
|
559
559
|
LOG(DEBUG) << "Trying to locate .PyRuntime data offset from program headers";
|
|
560
560
|
file_unique_ptr file(fopen(filename.c_str(), "r"), fclose);
|
|
561
561
|
if (!file || fileno(file.get()) == -1) {
|
|
562
|
-
LOG(ERROR) << "Cannot open ELF file " << filename;
|
|
562
|
+
LOG(ERROR) << "Cannot open ELF file " << filename << " (" << std::strerror(errno) << ")";
|
|
563
563
|
return "";
|
|
564
564
|
}
|
|
565
565
|
const int fd = fileno(file.get());
|
|
@@ -80,7 +80,7 @@ operator<<(std::ostream& out, const ParsedPyVersion& version)
|
|
|
80
80
|
// Use a temporary stringstream in case `out` is using hex or showbase
|
|
81
81
|
std::ostringstream oss;
|
|
82
82
|
oss << version.major << "." << version.minor << "." << version.patch;
|
|
83
|
-
if (version.release_level) {
|
|
83
|
+
if (version.release_level[0]) {
|
|
84
84
|
oss << version.release_level << version.serial;
|
|
85
85
|
}
|
|
86
86
|
|
|
@@ -97,7 +97,7 @@ parsePyVersionHex(uint64_t version, ParsedPyVersion& parsed)
|
|
|
97
97
|
int level = (version >> 4) & 0x0F;
|
|
98
98
|
int count = (version >> 0) & 0x0F;
|
|
99
99
|
|
|
100
|
-
const char* level_str =
|
|
100
|
+
const char* level_str = "(unknown release level)";
|
|
101
101
|
if (level == 0xA) {
|
|
102
102
|
level_str = "a";
|
|
103
103
|
} else if (level == 0xB) {
|
|
@@ -378,7 +378,7 @@ module_callback(
|
|
|
378
378
|
module_arg->addr = addr;
|
|
379
379
|
LOG(INFO) << "Symbol '" << sname << "' found at address " << std::hex << std::showbase
|
|
380
380
|
<< addr;
|
|
381
|
-
|
|
381
|
+
return DWARF_CB_ABORT;
|
|
382
382
|
}
|
|
383
383
|
}
|
|
384
384
|
return DWARF_CB_OK;
|
|
@@ -389,7 +389,7 @@ AbstractUnwinder::getAddressforSymbol(const std::string& symbol, const std::stri
|
|
|
389
389
|
{
|
|
390
390
|
LOG(DEBUG) << "Trying to find address for symbol " << symbol;
|
|
391
391
|
ModuleArg arg = {symbol.c_str(), modulename.c_str(), 0};
|
|
392
|
-
if (dwfl_getmodules(Dwfl(), module_callback, &arg, 0)
|
|
392
|
+
if (dwfl_getmodules(Dwfl(), module_callback, &arg, 0) == -1) {
|
|
393
393
|
throw UnwinderError("Failed to fetch modules!");
|
|
394
394
|
}
|
|
395
395
|
LOG(DEBUG) << "Address for symbol " << symbol << " resolved to: " << std::hex << std::showbase
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.6.0"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pystack
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
4
4
|
Summary: Analysis of the stack of remote python processes
|
|
5
5
|
Home-page: https://github.com/bloomberg/pystack
|
|
6
6
|
Author: Pablo Galindo Salgado
|
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.11
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.12
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
17
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
17
18
|
Classifier: Topic :: Software Development :: Debuggers
|
|
18
19
|
Requires-Python: >=3.7.0
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.5.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|