[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Weird Python Sinks Crash with GNU Radio 3.8.1
From: |
Marcus Müller |
Subject: |
Re: Weird Python Sinks Crash with GNU Radio 3.8.1 |
Date: |
Tue, 28 Apr 2020 13:08:21 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 |
Sadly, I can reproduce this, too, but only on 3.8; hm.
On 28.04.20 07:59, Christophe Seguinot wrote:
> Hi
>
> It crashes with a Segmentation fault (core dumped)
>
> * Ubuntu 18.04
> * GNURadio 3.8.1
>
>
> On 28/04/2020 07:07, Gilad Beeri (ApolloShield) wrote:
>> Hi,
>> Can someone with GNU Radio 3.8.1 and Python 3.8 on Linux run the
>> attached file and check if it crashes?
>>
>> I get persistent results over several computers for a crash on that
>> setup, while it is ok on Python 2.7 and GNU Radio 3.7.11.
>>
>> ᐧ
>>
>> On Sun, Apr 26, 2020 at 11:19 AM Gilad Beeri (ApolloShield)
>> <address@hidden <mailto:address@hidden>> wrote:
>>
>> Hi,
>> I succeeded in narrowing down the flowgraph to a minimal graph
>> that reproduces the issue. You can see the Python file attached.
>>
>> Basically, when having a file source that feeds 2 different Null
>> Python Sinks", the process crashes with a seg fault, with the same
>> stack trace I showed before:
>>
>> /include/gnuradio/py_feval.h:69/ which is /py_eval_ll::calleval(int)/:
>> /return eval(x);/
>>
>> The flowgraph is very simple:
>> File Source -> Python Null Sink - 2 times
>>
>> Replacing one of the Null Python Sinks to a standard Null Sink
>> "solves" the issue - the crash doesn't reproduce. You can
>> comment-in line 43 and comment-out line 44 to witness that.
>> I used the same file source block but I also tested it with 2
>> different file sources and it behaves the same.
>>
>> Any ideas why does this happen in GNU Radio 3.8.1?
>>
>> ᐧ
>>
>> On Thu, Apr 23, 2020 at 6:50 PM Gilad Beeri (ApolloShield)
>> <address@hidden <mailto:address@hidden>> wrote:
>>
>> I have a rather complex flowgraph that used to work well with
>> GNU Radio 3.7.
>> I upgraded to 3.8.1, and now it crashes (for some input, but
>> even when I use /dev/zero as file source) with something that
>> looks like in the core of GNU Radio (not directly in the block).
>>
>> Environment:
>> GNU Radio 3.8.1
>> Python 3.8.2
>> Ubuntu 16.04.6
>>
>> There are many blocks, but let's focus on the last ones.
>> I have a float-to-int block (the standard one) which feeds
>> data into a sink block that is written in Python. In case it
>> is relevant, this is the block that feeds the sink:
>> /float_to_int =
>> blocks.float_to_int(); self.connect(float_to_int, sink)/
>>
>> The process crashes with a segmentation fault.
>>
>> If I nullify the Python sink (commenting out all real
>> processing code in work()), the issue still happens.
>> Furthermore, I wrote a "my_null_sink" block in Python (see
>> code below). It still crashes with the same issue (after I
>> connected it to the float-to-int output instead of the
>> original Python sink).
>> When I replace "my_null_sink" with GNU Radio's standard Null
>> Sink, it doesn't crash anymore.
>> Using the same input file and my_null_sink, it crashes about
>> 95% of the runs (i.e., not 100%, but almost always), with Null
>> Sink, 0%.
>> That's why I believe it is something with the Python binding.
>> I do have other Python blocks in the flowgraph (one that is
>> connected to the file source and does some simple processing
>> before passing forward the samples).
>>
>> When I run it with gdb, I catch the exception and the stack
>> trace is below.
>> The 2nd frame in the stack sends us
>> to /block_gateway_impl.cc:139/, work(),
>> /_handler->calleval(0);/
>> The 1st stack frame doesn't have an associated module for the
>> specified address (0x0000000002324b90 in ??), "i sh" shows it
>> isn't associated with any module, and "info symbol <addr>"
>> confirms this. I also witness that all modules are loaded into
>> addresses > 0x00007f1300000000, so I assume the address from
>> the stack trace is really not a valid library, but some
>> garbage (it's also very close to 0).
>> The faulty memory address tends to change which is another
>> indication for garbage.
>>
>> Note: when I build the app in Debug, another stack frame
>> appears between the one that isn't associated with a module,
>> to the one in block_gateway_impl:
>> /include/gnuradio/py_feval.h:69/ which is
>> /py_eval_ll::calleval(int)/:
>> /return eval(x);/
>> /
>> /
>> When I implement the simplest flowgraph: File Source with
>> /dev/zero -> Throttle -> my_null_sink, it doesn't crash.
>>
>> In the original flowgraph, I disabled almost all blocks, and
>> specifically, I did not leave any enabled own C++ block - just
>> to rule out the possibility that one of the blocks corrupts
>> the memory. It didn't change anything.
>>
>> I tested it on another machine with a similar setup (GNU Radio
>> 3.8.1) and it reproduced. On an older machine, still with GNU
>> Radio 3.7.11.1, it works (doesn't crash).
>>
>> Any ideas will be appreciated.
>> ------
>>
>> _my_null_sink.py_
>> /
>> /
>> /import numpy
>> from gnuradio import gr
>>
>>
>> class my_null_sink(gr.sync_block):
>> def __init__(self):
>> gr.sync_block.__init__(
>> self,
>> name="my_null_sink",
>> in_sig=[numpy.int32],
>> out_sig=None)
>> print('***** my_null_sink init')
>>
>> def work(self, input_items, output_items):
>> return len(input_items[0])/
>>
>>
>> _Exception in GDB_
>> _
>> _
>> /Thread 20 "my_null_sink25" received signal SIGSEGV,
>> Segmentation fault
>> /
>> /#0 0x0000000002324b90 in ?? ()
>> #1 0x00007f5ec43df433 in gr::block_gateway_impl::work
>> (this=this@entry=0x2324fc0, noutput_items=8,
>> input_items=std::vector of length 1, capacity 1 = {...},
>> output_items=std::vector of length 0, capacity 0)
>> at
>>
>> /home/user/gr/src/gnuradio/gnuradio-runtime/lib/block_gateway_impl.cc:139
>> #2 0x00007f5ec43df471 in gr::block_gateway_impl::general_work
>> (this=0x2324fc0, noutput_items=<optimized out>, ninput_items=...,
>> input_items=std::vector of length 1, capacity 1 = {...},
>> output_items=...)
>> at
>>
>> /home/user/gr/src/gnuradio/gnuradio-runtime/lib/block_gateway_impl.cc:121
>> #3 0x00007f5ec43dc4c4 in
>> gr::block_executor::run_one_iteration
>> (this=this@entry=0x7f5e71ffadf0)
>> at
>> /home/user/gr/src/gnuradio/gnuradio-runtime/lib/block_executor.cc:514
>> #4 0x00007f5ec4439097 in gr::tpb_thread_body::tpb_thread_body
>> (this=0x7f5e71ffadf0, block=..., start_sync=...,
>> max_noutput_items=<optimized out>) at
>>
>> /home/user/gr/src/gnuradio/gnuradio-runtime/lib/tpb_thread_body.cc:122
>> #5 0x00007f5ec4428932 in gr::tpb_container::operator()
>> (this=0x2ab6640)
>> at
>> /home/user/gr/src/gnuradio/gnuradio-runtime/lib/scheduler_tpb.cc:50
>> #6
>> gr::thread::thread_body_wrapper<gr::tpb_container>::operator()
>> (this=0x2ab6640)
>> at
>>
>> /home/user/gr/src/gnuradio/gnuradio-runtime/lib/../include/gnuradio/thread/thread_body_wrapper.h:52
>> #7
>>
>> boost::detail::function::void_function_obj_invoker0<gr::thread::thread_body_wrapper<gr::tpb_container>,
>> void>::invoke (function_obj_ptr=...)
>> at /usr/include/boost/function/function_template.hpp:159
>> #8 0x00007f5ec4444260 in boost::function0<void>::operator()
>> (this=<optimized out>) at
>> /usr/include/boost/function/function_template.hpp:773
>> #9 boost::detail::thread_data<boost::function0<void>
>> const>::run (this=<optimized out>) at
>> /usr/include/boost/thread/detail/thread.hpp:116
>> #10 0x00007f5ec27fc5d5 in ?? () from
>> /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.58.0
>> #11 0x00007f5ee913a6ba in start_thread (arg=0x7f5e71ffb700) at
>> pthread_create.c:333
>> #12 0x00007f5ee831d41d in clone () at
>> ../sysdeps/unix/sysv/linux/x86_64/clone.S:109/
>> ᐧ
>>