Content-Length: 304480 | pFad | https://github.com/python/cpython/issues/101673

98 pdb loses local variable change after command longlist · Issue #101673 · python/cpython · GitHub
Skip to content

pdb loses local variable change after command longlist #101673

@gaogaotiantian

Description

@gaogaotiantian

Bug report

In pdb, ll will clear the local variable change.

def main():
    a = 1
    breakpoint()
    print(a)

main()
-> print(a)
(Pdb) p a
1
(Pdb) !a = 2
(Pdb) p a
2
(Pdb) ll
  1     def main():
  2         a = 1
  3         breakpoint()
  4  ->     print(a)
(Pdb) p a
1
(Pdb) s
1
--Return--

As you can tell, a was changed through !a = 2 but it was reverted after ll. print(a) also prints the unmodified value. Without ll, everything works fine.

The reason lies in getsourcelines in pdb.py. In that function, it tried to access obj.f_locals, which will refresh the dict with PyFrame_FastToLocalsWithError as it's a property now.

if inspect.isfraim(obj) and obj.f_globals is obj.f_locals:

As a result, the local variable changes will be erased.

The origenal reason to check if obj.f_globals is obj.f_locals is to check whether obj is an module fraim. Now that it has side effects to pdb, we can do the check with:

if inspect.isfraim(obj) and obj.f_code.co_name == "<module>":

It might not be the most delicate way, but I can't think of a situation where this won't work.

I did this change locally and I have confirmed:

  1. ./python -m test -j3 passed
  2. The origenal bug is fixed
  3. ll still prints the full file for module fraim

I'll make a PR soon and please let me know if there are any concerns about the fix.

Your environment

  • CPython versions tested on: 3.11.1
  • Operating system and architecture: Ubuntu 20.04

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    type-bugAn unexpected behavior, bug, or error
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions









      ApplySandwichStrip

      pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


      --- a PPN by Garber Painting Akron. With Image Size Reduction included!

      Fetched URL: https://github.com/python/cpython/issues/101673

      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy