From a680340023395a0d0d63f4feac593e0bb68b2159 Mon Sep 17 00:00:00 2001 From: Florian Ziemen <florianziemen@users.noreply.github.com> Date: Thu, 6 Feb 2025 16:56:30 +0100 Subject: [PATCH] simple python call with stack trace to be continued... --- lectures/debugging-strategies/slides.qmd | 124 ++++++++++------------- 1 file changed, 53 insertions(+), 71 deletions(-) diff --git a/lectures/debugging-strategies/slides.qmd b/lectures/debugging-strategies/slides.qmd index 5c96f6c..69b0ab8 100644 --- a/lectures/debugging-strategies/slides.qmd +++ b/lectures/debugging-strategies/slides.qmd @@ -2,7 +2,17 @@ title: "Debugging Strategies" --- -# Debugging vs. Testing {.leftalign} +# What are we looking at? + +## Bugs make software misbehave +* Crash +* Freeze +* Bogus result +* Slightly wrong result +* Security vulnerability +* ... + +## Debugging vs. Testing **Testing:** Cover as many use cases as possible to make a program more robust @@ -11,87 +21,67 @@ title: "Debugging Strategies" ## Strategies covered in this lecture - - Include debug output/logging mechanisms - - Narrow down the code where the error occured (divide and conquer) - - Use a debugger +- Read the error message +- Include debug output/logging mechanisms +- Narrow down the code where the error occured (divide and conquer) +- Use a debugger ## Other strategies -- [Debugging compiled code](../../old_lectures/debugging-compiled-languages/) +- Search online for the error message / problem description - Consider the last working state and focus on what changed since - If changes are committed in a repo, find the last valid commit (`git bisect`) -- Search online for this or similar issues - Ask colleagues working with the same code -- Call for vendor support - - - -## Locating the right error message {.leftalign} - -::::::::{.columns .smaller} +- [Debugging compiled code](../../old_lectures/debugging-compiled-languages/) -:::{.column width=50%} -```python -def _extend_number(num): - return 10*num + (num % 10) -1 - -def extend_number(num): - try: - for idx in range(num): - num = _extend_number(num) - except: - num = extend_number(num) - - return num - -print(extend_number('6')) -``` -Expected output: +## Reading an error message {.special} +Try this in python: +```python +import xarray as xr +xr.open_dataset ("/scrattch/k/k202134/test.nc") ``` -6543210 -``` - -::: - -:::{.column width=50% .fragment} - -Actual output (last 17 lines) - -``` +## Python output for open_dataset {.special} +```python Traceback (most recent call last): - File "number_extension.py", line 6, in extend_number - for idx in range(num): -RecursionError: maximum recursion depth exceeded while calling a Python object + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/file_manager.py", line 210, in _acquire_with_cache_info + file = self._cache[self._key] + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/lru_cache.py", line 56, in __getitem__ + value = self._cache[key] +KeyError: [<class 'netCDF4._netCDF4.Dataset'>, ('/scrattch/k/k202134/test.nc',), 'r', (('clobber', True), ('diskless', False), ('format', 'NETCDF4'), ('persist', False)), '14687e3e-f5b3-4c71-9879-3db9386888df'] During handling of the above exception, another exception occurred: + Traceback (most recent call last): - File "number_extension.py", line 13, in <module> - print(extend_number('6')) - File "number_extension.py", line 9, in extend_number - num = extend_number(num) - File "number_extension.py", line 9, in extend_number - num = extend_number(num) - File "number_extension.py", line 9, in extend_number - num = extend_number(num) - [Previous line repeated 996 more times] -RecursionError: maximum recursion depth exceeded + File "<stdin>", line 1, in <module> + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/api.py", line 525, in open_dataset + backend_ds = backend.open_dataset( + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/netCDF4_.py", line 588, in open_dataset + store = NetCDF4DataStore.open( + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/netCDF4_.py", line 389, in open + return cls(manager, group=group, mode=mode, lock=lock, autoclose=autoclose) + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/netCDF4_.py", line 336, in __init__ + self.format = self.ds.data_model + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/netCDF4_.py", line 398, in ds + return self._acquire() + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/netCDF4_.py", line 392, in _acquire + with self._manager.acquire_context(needs_lock) as root: + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/contextlib.py", line 135, in __enter__ + return next(self.gen) + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/file_manager.py", line 198, in acquire_context + file, cached = self._acquire_with_cache_info(needs_lock) + File "/sw/spack-levante/mambaforge-22.9.0-2-Linux-x86_64-kptncg/lib/python3.10/site-packages/xarray/backends/file_manager.py", line 216, in _acquire_with_cache_info + file = self._opener(*self._args, **kwargs) + File "src/netCDF4/_netCDF4.pyx", line 2353, in netCDF4._netCDF4.Dataset.__init__ + File "src/netCDF4/_netCDF4.pyx", line 1963, in netCDF4._netCDF4._ensure_nc_success +FileNotFoundError: [Errno 2] No such file or directory: b'/scrattch/k/k202134/test.nc' ``` -<!-- -issues in line 9 and 13 ---> - -::: - -:::::::: - - ## Hands-On! (5-10min) {.handson} 1. What are the actual issues in the code from the previous slide based on the error messages? @@ -101,19 +91,11 @@ issues in line 9 and 13 ## Fixing run-time errors - Produce sensible debug messages to determine code area with the issue - - Use proper compiler flags for debug output + - Use proper flags for debug output - Check prerequisites/environment - Create minimal working example - Use debugger - -## Prevent errors - - - Testing! - - Using linters (static code analysis) like [ruff](https://github.com/astral-sh/ruff) for Python - - Even ensure proper formatting with tools like [black](https://github.com/psf/black) for Python - - Consider using an IDE with its tools - # Errors due to data access and communication -- GitLab