You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I have searched the existing issues (open and closed), and could not find an existing issue
What keywords did you use to search existing issues?
urllib3 contrib
What operating system(s) are you using?
Windows 10
If you selected 'Other', describe your Operating System here
No response
What version of Python are you running?
>python -VPython 3.10.0
How did you install twine? Did you use your operating system's package manager or pip or something else?
>pip install twine
What version of twine do you have installed (include the complete output)
twine version 5.1.1
Which package repository are you using?
pypi.org
Please describe the issue that you are experiencing
When I run "twine upload dist/*", I get an exception:
C:\Program Files\Python310\lib\site-packages\requests\__init__.py:102: RequestsDependencyWarning: urllib3 (2.2.3) or chardet (None)/charset_normalizer (2.0.7) doesn't match a supported version!
warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
Traceback (most recent call last):
File "C:\Program Files\Python310\lib\site-packages\requests_toolbelt\_compat.py", line 48, in <module>
from requests.packages.urllib3.contrib import appengine as gaecontrib
ImportError: cannot import name 'appengine' from 'requests.packages.urllib3.contrib' (C:\Program Files\Python310\lib\site-packages\urllib3\contrib\__init__.py)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Program Files\Python310\lib\runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "C:\Program Files\Python310\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "C:\Program Files\Python310\Scripts\twine.exe\__main__.py", line 7, in <module>
File "C:\Program Files\Python310\lib\site-packages\twine\__main__.py", line 33, in main
error = cli.dispatch(sys.argv[1:])
File "C:\Program Files\Python310\lib\site-packages\twine\cli.py", line 121, in dispatch
main = registered_commands[args.command].load()
File "C:\Program Files\Python310\lib\site-packages\importlib_metadata\__init__.py", line 194, in load
module = import_module(match.group('module'))
File "C:\Program Files\Python310\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "C:\Program Files\Python310\lib\site-packages\twine\commands\upload.py", line 28, in <module>
from twine import settings
File "C:\Program Files\Python310\lib\site-packages\twine\settings.py", line 23, in <module>
from twine import repository
File "C:\Program Files\Python310\lib\site-packages\twine\repository.py", line 18, in <module>
import requests_toolbelt
File "C:\Program Files\Python310\lib\site-packages\requests_toolbelt\__init__.py", line 12, in <module>
from .adapters import SSLAdapter, SourceAddressAdapter
File "C:\Program Files\Python310\lib\site-packages\requests_toolbelt\adapters\__init__.py", line 12, in <module>
from .ssl import SSLAdapter
File "C:\Program Files\Python310\lib\site-packages\requests_toolbelt\adapters\ssl.py", line 16, in <module>
from .._compat import poolmanager
File "C:\Program Files\Python310\lib\site-packages\requests_toolbelt\_compat.py", line 50, in <module>
from urllib3.contrib import appengine as gaecontrib
ImportError: cannot import name 'appengine' from 'urllib3.contrib' (C:\Program Files\Python310\lib\site-packages\urllib3\contrib\__init__.py)
I know about #989. urllib3 v2 has been around for a while, it would be nice to provide conditional support.
Please list the steps required to reproduce this behaviour
Run twine --version against the current urllib3.
Please include the PKG-INFO file contents from the artifact you're attempting to upload
Metadata-Version: 2.1
Name: dwex
Version: 4.21
Summary: GUI viewer for DWARF debug information
Home-page: https://github.com/sevaa/dwex/
Author: Seva Alekseyev
Author-email: [email protected]License: BSD
Keywords: dwarf,debug,debugging,symbols,viewer,view,browser,browse,tree
Platform: any
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Environment :: MacOS X :: Cocoa
Classifier: Environment :: Win32 (MS Windows)
Classifier: Environment :: X11 Applications :: Qt
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Topic :: Software Development :: Debuggers
Requires-Python: >=3.6.1
Description-Content-Type: text/markdown
DWARF Explorer
==============
A cross-platform GUI utility for visualizing the DWARF
debugging information in executable files, built on top of [pyelftools](https://github.com/eliben/pyelftools) and [filebytes](https://github.com/sashs/filebytes). Runs on Windows, MacOS X, and Linux. Supports parsing the following file types for DWARF data:
- ELF (Linux, Android)
- Mach-O (MacOS X, iOS)
- PE (Windows, Cygwin)
- WASM (aka WebAssembly)
- ar (.a files, Linux/Unix/MacOS X static libraries)
This project came from my desire to see and navigate the DWARF tree of compiled Android and iOS binaries. Seeing the DIEs is easy enough with utilities like `readelf` or `dwarfdump`. However, chasing inter-DIE references back and forth is not straightforward with those.
The utility might be of use for anyone who is building DWARF parsers for one or another reason, especially if their preferred parsing library is `pyelftools`.
Note that regular Windows executables (EXE/DLL files) are PE files but don't, as a rule, contain DWARF information. The Microsoft toolchains (Visual Studio and the like) produce debugging information in Microsoft's own format, Program Database (PDB). There are, though, a couple of toolchains that produce PE files with DWARF debug info in them - notably GCC under Cygwin. DWARF Explorer is compatible with those.
The pyelftools library that dwex is based on supports DWARF versions 2-5, and so does dwex. DWARFv5 support might be unstable. DWARF v1 is supported experimentally, in ELF files only.
There is a known issue with incorrect parsing of DWARF in .o files and static libraries that contain them. See [eliben/pyelftools#564](https://github.com/eliben/pyelftools/issues/564). Mach-O fat binary object files inside static libraries are not supported.
Requirements and Dependencies
------------
- Python 3.6.1+
- PyQt6
- filebytes 0.10.1+
- pyelftools 0.30+
Installation
-------------
If necessary, install [the latest Python](https://www.python.org/downloads/) in the way that's appropriate for your OS. Run `pip install dwex` from the command line, under `sudo` or elevated command line if necessary.
On Windows, if `pip` and/or Python is not in PATH, use `c:\Python39\python -m pip install dwex`, substituting your own path to Python 3.
Alternatively, get the dwex source tree from Github, and run `python setup.py install` in the root folder of the package. In this scenario, you'd have to install the dependencies separately - with `pip install pyqt6 filebytes pyelftools`.
On Linux, sometimes the `python` command defaults to Python 2 while Python 3 is installed side by side. In this case, use `python3` and `pip3`, respectively. Use `python -V` to check.
Once you install it, there will be a `dwex` command. On Windows, there will be a `dwex.exe` in the `Scripts` folder under the Python folder, and also a start menu item "DWARF Explorer". On Linux, there
will be a "DWARF Explorer" in the app menu (tested under GNOME).
In January 2022, the utility was migrated from PyQt5 to PyQt6, and the major version was bumped to 2. That cut off support for Python 3.5. The 1.x version that is compatible with Python 3.5 is still out in the repository, and pip should resolve it.
If it does not, install by running `pip install "dwex<2"`.
Usage
-----
Click Open in the File menu, choose your executable, and eyeball the DWARF tree. Alternatively, drag and drop an executable onto the main window. You can open by dropping a dSYM bundle folder, too.
On the most basic level, the debug information in a compiled file is an array of *compilation units* (CUs). Each CU contains a tree of data items called *Debugging Information Entries* (DIEs). Each DIE has a title called *tag*, and contains a name-value dictionary called *attributes*. Each CU has exactly one root DIE, and the rest of the DIEs are in its subtree.
The UI of DWARF Explorer was meant for eyeballing that data structure:

The left hand tree displays the DIEs, with CU root DIEs on the top level. Expand the tree and click on DIEs to see their attributes. DIE attributes that have a substructure or point at larger data structures are clickable.
DIEs generally correspond to source level entities in the program - variables, functions, classes, members, methods, etc. The DIE tag tells you which one is it. The exact way the compiler builds a DIE tree to describe the program varies between source languages, compiler versions, target platforms and architectures. The official home of the DWARF spec is at [dwarfstd.org](http://dwarfstd.org/), but there's considerable leeway for implementations to improvise upon. On top of that, the DWARF spec contains explicit extension points for compiler vendors to tap into.
DIE attribute values are relatively small scalars - integers, strings, sometimes short byte arrays. However, they sometimes refer at larger data structures. Physically, it's an integer, but logically, it's a pointer to some data elsewhere. Also, DIE attribute values may contain references to other DIEs - for example, a DIE for a variable would contain a reference to a DIE that describes its datatype. DIE attributes that contain references to other DIEs are rendered in blue; the link can be followed by a double-click or a Ctrl+Enter. To come back to the original DIE, use Navigate/Back, the Back mouse button, or an appropriate keyboard shortcut (Alt-Left on Windows and Linux, Ctrl-[ on Mac).
In DWARF, tag and attribute names are prefixed with `DW_TAG_` and `DW_AT_`, respectively. DWARF Explorer elides those by default to reduce visual clutter. Use `View/DWARF prefix` in the menu to bring them back.
Disclaimer
----------
This project is unrelated to [ragundo/DwarfExplorer](https://github.com/ragundo/DwarfExplorer). That one deals with a different kind of dwarves. Although, interestingly enough, they also use the Qt library for their GUI.
Prior art
---------
There is also a GUI DWARF visualizer at [simark/dwarftree](https://github.com/simark/dwarftree). Also based on pyelftools,
with gtk based UI. It's been inactive since 2015. I didn't know about it when I started.
Pairs well with
---------------
For a free general purpose GUI ELF file visualizer, see [horsicq/XELFViewer](https://github.com/horsicq/XELFViewer).
The issue was in the requests module all along - it didn't require urllib3 v2. Or maybe, it was superficially compatible with urllib3 v1, but not in the code path that twine was using. The problem is gone for me now anyway, even with twine 5.1.1. It would take a deliberate effort to try to reproduce the conditions of the fault.
pypa
locked and limited conversation to collaborators
Feb 3, 2025
Sign up for freeto subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Is there an existing issue for this?
What keywords did you use to search existing issues?
urllib3 contrib
What operating system(s) are you using?
Windows 10
If you selected 'Other', describe your Operating System here
No response
What version of Python are you running?
How did you install twine? Did you use your operating system's package manager or pip or something else?
>pip install twine
What version of twine do you have installed (include the complete output)
twine version 5.1.1
Which package repository are you using?
pypi.org
Please describe the issue that you are experiencing
When I run "twine upload dist/*", I get an exception:
I know about #989. urllib3 v2 has been around for a while, it would be nice to provide conditional support.
Please list the steps required to reproduce this behaviour
Run
twine --version
against the current urllib3.Please include the PKG-INFO file contents from the artifact you're attempting to upload
A redacted version of your
.pypirc
fileAnything else you'd like to mention?
No response
The text was updated successfully, but these errors were encountered: