-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
dir()
inside class property/method causes board reset
#8360
Comments
Weird. I just tried this on >>> simple_object = SimpleClass(1, "2")
>>> dir()
['simple_object', 'SimpleClass', '__name__', '__file__']
>>> dir(simple_object)
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
>>>
>>> simple_object.property1
[['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
(1, '2')
>>> simple_object.some_func()
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
['__class__', '__init__', '__module__', '__qualname__', '__dict__', 'param1', 'param2', 'property1', 'some_func']
>>> |
This is probably a duplicate of There may be two separate problems. First, Recursion uses up a finite resource called the stack. When the stack is exhausted, this is supposed to be detected by an exception. In standard Python there's a dedicated type for this exception (RecursionError); in CircuitPython this is just a RuntimeError.. In an example where the same line is printed repeatedly, this occurs because the 'innermost' dir() has raised RecursionError, and then each recursive call to FWIW I reproduced this on |
I found that when I increased the amount of 'grace area' in the stack check from 1kB to 2kB I didn't reproduce the problem anymore. There's no particular justification for this value that I could find; it depends how much "additional stuff" can be placed on the stack subsequent to a call to mp_stack_check and I don't think there's any simple way to calculate the maximum such value. diff --git a/main.c b/main.c
index 94a3feac6b..d0727beb53 100644
--- a/main.c
+++ b/main.c
@@ -163,7 +163,7 @@ STATIC void start_mp(supervisor_allocation *heap, supervisor_allocation *pystack
if (stack_bottom != NULL) {
size_t stack_length = stack_get_length();
mp_stack_set_top(stack_bottom + (stack_length / sizeof(uint32_t)));
- mp_stack_set_limit(stack_length - 1024);
+ mp_stack_set_limit(stack_length - 2048);
}
|
In ljinux I have seen plenty of |
The corresponding MicroPython issue is micropython#4546. At one point I looked at fixing this but it was not so easy. Dupes:
We could consolidate this to a single issue but there is interesting info in all of them. |
The root cause of this is #2179. Closing in favor of that issue. |
CircuitPython version
Code/REPL
Behavior
Board crashed every time it reaches the
dir(self)
, no output, simply the sound of USB device disconnected and then after a few secodns connected againDescription
dir()
is inside a property or a method, it crashes the boarddir()
is called outside a class, it works as expectedAdditional information
No response
The text was updated successfully, but these errors were encountered: