fix OverflowError in backtraces with 32bit kernels

Message ID 56C8A021.1000800@ubuntu.com
State New, archived
Headers

Commit Message

Matthias Klose Feb. 20, 2016, 5:19 p.m. UTC
  This was reported at
https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/1513922

That's using i386, using "backtrace" gives those errors

"Traceback (most recent call last):
   File "/usr/share/gdb/python/gdb/FrameDecorator.py", line 97, in function
     if not isinstance(self._base, gdb.Frame):
SystemError: <built-in function isinstance> returned a result with an error set

#1 0xffffffff in OverflowError: Python int too large to convert to C long"

and a patch was suggested by Julian Taylor, which applies to the trunk as well.

Matthias
  

Comments

Pedro Alves Oct. 4, 2016, 2:24 p.m. UTC | #1
On 02/20/2016 05:19 PM, Matthias Klose wrote:
> This was reported at
> https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/1513922
> 
> That's using i386, using "backtrace" gives those errors
> 
> "Traceback (most recent call last):
>   File "/usr/share/gdb/python/gdb/FrameDecorator.py", line 97, in function
>     if not isinstance(self._base, gdb.Frame):
> SystemError: <built-in function isinstance> returned a result with an
> error set
> 
> #1 0xffffffff in OverflowError: Python int too large to convert to C long"
> 
> and a patch was suggested by Julian Taylor, which applies to the trunk
> as well.
> 
> Matthias

Looks like this was never reviewed, sorry about that.

Looks good to me.  OK with a ChangeLog entry.

I wonder whether we should be using get_addr_from_python
here and in the other spot in the file we read an address
though:

	  else if (PyLong_Check (py_func))
	    {
	      CORE_ADDR addr = PyLong_AsUnsignedLongLong (py_func);
	      struct bound_minimal_symbol msymbol;


> --- gdb-7.10.orig/gdb/python/py-framefilter.c
> +++ gdb-7.10/gdb/python/py-framefilter.c
> @@ -1111,7 +1111,7 @@ py_print_frame (PyObject *filter, int fl
> 
>           if (paddr != Py_None)
>             {
> -             address = PyLong_AsLong (paddr);
> +             address = PyLong_AsUnsignedLongLong (paddr);
>               has_addr = 1;
>             }
>           Py_DECREF (paddr);

Thanks,
Pedro Alves
  
Yao Qi Oct. 4, 2016, 4:16 p.m. UTC | #2
On Tue, Oct 4, 2016 at 3:24 PM, Pedro Alves <palves@redhat.com> wrote:
> On 02/20/2016 05:19 PM, Matthias Klose wrote:
>> This was reported at
>> https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/1513922
>>
>> That's using i386, using "backtrace" gives those errors
>>
>> "Traceback (most recent call last):
>>   File "/usr/share/gdb/python/gdb/FrameDecorator.py", line 97, in function
>>     if not isinstance(self._base, gdb.Frame):
>> SystemError: <built-in function isinstance> returned a result with an
>> error set
>>
>> #1 0xffffffff in OverflowError: Python int too large to convert to C long"
>>
>> and a patch was suggested by Julian Taylor, which applies to the trunk
>> as well.
>>
>> Matthias
>
> Looks like this was never reviewed, sorry about that.
>
> Looks good to me.  OK with a ChangeLog entry.
>

We need this fix in 7.12 branch too.
  

Patch

--- gdb-7.10.orig/gdb/python/py-framefilter.c
+++ gdb-7.10/gdb/python/py-framefilter.c
@@ -1111,7 +1111,7 @@  py_print_frame (PyObject *filter, int fl

           if (paddr != Py_None)
             {
-             address = PyLong_AsLong (paddr);
+             address = PyLong_AsUnsignedLongLong (paddr);
               has_addr = 1;
             }
           Py_DECREF (paddr);