getappmap / appmap-python

AppMap client agent for Python
https://appland.org
Other
99 stars 16 forks source link

Cannot run appmap with clr package. #231

Open fossum opened 1 year ago

fossum commented 1 year ago

I thought I'd try out your application, but I ran into an issue early. Seems like it doesn't work with either pythonnet or clr. Below you can see I just install the two and I cannot import clr.

PS C:\Users\ericfoss\temp> pipenv graph
appmap==1.14.1
  - importlib-metadata [required: >=0.8, installed: 6.0.0]
    - zipp [required: >=0.5, installed: 3.14.0]
  - importlib-resources [required: >=5.4.0,<6.0.0, installed: 5.12.0]
  - inflection [required: >=0.3.0, installed: 0.5.1]
  - packaging [required: >=21.3,<22.0, installed: 21.3]
    - pyparsing [required: >=2.0.2,!=3.0.5, installed: 3.0.9]
  - PyYAML [required: >=5.3.0, installed: 6.0]
pythonnet==3.0.1
  - clr-loader [required: >=0.2.2,<0.3.0, installed: 0.2.5]
    - cffi [required: >=1.13, installed: 1.15.1]
      - pycparser [required: Any, installed: 2.21]
PS C:\Users\ericfoss\temp> pipenv run python
Python 3.10.6 (tags/v3.10.6:9c7b4bd, Aug  1 2022, 21:53:49) [MSC v.1932 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
Failed to initialize pythonnet: System.NullReferenceException: Object reference not set to an instance of an object.
   at Python.Runtime.PythonException.TryDecodePyErr(BorrowedReference typeRef, BorrowedReference valRef, BorrowedReference tbRef)
   at Python.Runtime.PythonException.FetchCurrentOrNull(ExceptionDispatchInfo& dispatchInfo)
   at Python.Runtime.PythonException.ThrowLastAsClrException()
   at Python.Runtime.ImportHook.SetupImportHook()
   at Python.Runtime.ImportHook.Initialize()
   at Python.Runtime.Runtime.Initialize(Boolean initSigs)
   at Python.Runtime.PythonEngine.Initialize(IEnumerable`1 args, Boolean setSysArgv, Boolean initSigs)
   at Python.Runtime.PythonEngine.InitExt()
   at Python.Runtime.Loader.Initialize(IntPtr data, Int32 size)
   at Python.Runtime.PythonException.TryDecodePyErr(BorrowedReference typeRef, BorrowedReference valRef, BorrowedReference tbRef)
   at Python.Runtime.PythonException.FetchCurrentOrNull(ExceptionDispatchInfo& dispatchInfo)
   at Python.Runtime.PythonException.ThrowLastAsClrException()
   at Python.Runtime.ImportHook.SetupImportHook()
   at Python.Runtime.ImportHook.Initialize()
   at Python.Runtime.Runtime.Initialize(Boolean initSigs)
   at Python.Runtime.PythonEngine.Initialize(IEnumerable`1 args, Boolean setSysArgv, Boolean initSigs)
   at Python.Runtime.PythonEngine.InitExt()
   at Python.Runtime.Loader.Initialize(IntPtr data, Int32 size)Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  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 "C:\Users\ericfoss\temp\.venv\lib\site-packages\appmap\wrapt\wrappers.py", line 581, in __call__
    return self._self_wrapper(self.__wrapped__, instance,
  File "C:\Users\ericfoss\temp\.venv\lib\site-packages\_appmap\importer.py", line 231, in wrapped_exec_module
    exec_module(*args, **kwargs)
  File "C:\Users\ericfoss\temp\.venv\lib\site-packages\clr.py", line 6, in <module>
    load()
  File "C:\Users\ericfoss\temp\.venv\lib\site-packages\pythonnet\__init__.py", line 144, in load
    raise RuntimeError("Failed to initialize Python.Runtime.dll")
RuntimeError: Failed to initialize Python.Runtime.dll
>>>
brikelly commented 1 year ago

@fossum thank you for logging this! Appreciate you for trying AppMap out.

@apotterri could you please comment on the packages involved, and if we could support them?

apotterri commented 1 year ago

Hi @fossum. Welcome, and as @brikelly said, thanks for your interest in AppMap!

I spent a little time investigating this issue. Unfortunately, the approach appmap-python takes to instrumenting code isn't compatible with pythonnet. As a result, it's not currently possible to map applications that use it.

fossum commented 1 year ago

Dang, okay. Thanks for the update. I'll see if I can isolate some code.

A possible feature request would be a decorator that disabled that incompatible part.

apotterri commented 1 year ago

Sadly, the problem appears to be related to way that appmap-python interacts with the finders in sys.meta_path. Disabling that is effectively the same as uninstalling. :(

I'm not 100% convinced that we couldn't get this work. It would just require some more time.