Hi all,
When I set the decimation of a fir_filter or integrate block with float
input and output to 262144 or above, gnuradio crashes with a segfault.
With complex inputs and outputs I get a segfault above 524288.
with short inputs and outputs it is at decimation 131072.
This seems to be the case with most (all) sync_decimator blocks like
fir_filters or the integration block.
The blocks seem to be are accessing the input buffer outside the valid
range. Which indicates that the input buffers are too small.
What is strange is that if the datatype is 2 times as large (float = 4
bytes, complex = 8 bytes) the decimation factor may also be 2 times
larger, which indicates that the problem occurs at a bufferposition that
is 2x2 = 4 times larger.
So the buffersize does not seem to be fixed.
The required buffersizes should be automatically calculated before
creating the buffers.
Are all buffers still calculated and instantiated in flat_flowgraph.cc ?
I could not yet find any obvious errors in calculating the required
buffer sizes. But something is going wrong.
The buffersize calculation in flat_flowgraph.cc :
flat_flowgraph::allocate_buffer(basic_block_sptr block, int port) {
...
...
double decimation = (1.0/dgrblock->relative_rate());
int multiple = dgrblock->output_multiple();
int history = dgrblock->history();
nitems = std::max(nitems,
static_cast<int>(2*(decimation*multiple+history)));
When using the integration_ff block gdb debug shows that the segfault is
at line 61 of integrate_ff_impl.cc
51 integrate_ff_impl::work(int noutput_items,
52 gr_vector_const_void_star &input_items,
53 gr_vector_void_star &output_items)
54 {
55 const float *in = (const float *)input_items[0];
56 float *out = (float *)output_items[0];
57
58 for (int i = 0; i < noutput_items; i++) {
59 out[i] = (float)0;
60 for (int j = 0; j < d_decim; j++)
61 out[i] += in[i*d_decim+j];//<== segfault here !!!
62 }
gnuradio-config-info -v
3.7.7git-0-gf0cd5041
With best regards,
Martin Dudok van Heel
<?xml version='1.0' encoding='ASCII'?>
<?grc format='1' created='3.7.7'?>
<flow_graph>
<timestamp>Thu Feb 12 22:15:08 2015</timestamp>
<block>
<key>blocks_null_source</key>
<param>
<key>id</key>
<value>null_source</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>type</key>
<value>complex</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
<param>
<key>num_outputs</key>
<value>1</value>
</param>
<param>
<key>bus_conns</key>
<value>[[0,],]</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>_coordinate</key>
<value>(392, 217)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>low_pass_filter</key>
<param>
<key>id</key>
<value>low_pass_filter</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>type</key>
<value>fir_filter_ccf</value>
</param>
<param>
<key>decim</key>
<value>decimation</value>
</param>
<param>
<key>interp</key>
<value>1</value>
</param>
<param>
<key>gain</key>
<value>1</value>
</param>
<param>
<key>samp_rate</key>
<value>1</value>
</param>
<param>
<key>cutoff_freq</key>
<value>0.25</value>
</param>
<param>
<key>width</key>
<value>0.125</value>
</param>
<param>
<key>win</key>
<value>firdes.WIN_HAMMING</value>
</param>
<param>
<key>beta</key>
<value>6.76</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>minoutbuf</key>
<value>0</value>
</param>
<param>
<key>maxoutbuf</key>
<value>0</value>
</param>
<param>
<key>_coordinate</key>
<value>(552, 154)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>blocks_null_sink</key>
<param>
<key>id</key>
<value>null_sink</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>type</key>
<value>complex</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
<param>
<key>num_inputs</key>
<value>1</value>
</param>
<param>
<key>bus_conns</key>
<value>[[0,],]</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(784, 217)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>parameter</key>
<param>
<key>id</key>
<value>decimation</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>label</key>
<value>decimation. 524287 succeeds but 524288 and above fails with segfault</value>
</param>
<param>
<key>value</key>
<value>524288</value>
</param>
<param>
<key>type</key>
<value>intx</value>
</param>
<param>
<key>short_id</key>
<value>d</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(392, 308)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<block>
<key>options</key>
<param>
<key>id</key>
<value>test_large_decimation_crash_firfilter_cc</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>title</key>
<value>integration block with large decimation segfaults</value>
</param>
<param>
<key>author</key>
<value>Martin Dudok van Heel</value>
</param>
<param>
<key>description</key>
<value>an integrate block crashes with segfault with decimation 262144 or above. Probably accessing input buffer outside valid region.</value>
</param>
<param>
<key>window_size</key>
<value>1280, 1024</value>
</param>
<param>
<key>generate_options</key>
<value>no_gui</value>
</param>
<param>
<key>category</key>
<value>Custom</value>
</param>
<param>
<key>run_options</key>
<value>run</value>
</param>
<param>
<key>run</key>
<value>True</value>
</param>
<param>
<key>max_nouts</key>
<value>0</value>
</param>
<param>
<key>realtime_scheduling</key>
<value></value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
<value>(10, 10)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
</block>
<connection>
<source_block_id>null_source</source_block_id>
<sink_block_id>low_pass_filter</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>low_pass_filter</source_block_id>
<sink_block_id>null_sink</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
</flow_graph>
#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: integration block with large decimation segfaults
# Author: Martin Dudok van Heel
# Description: an integrate block crashes with segfault with decimation 262144 or above. Probably accessing input buffer outside valid region.
# Generated: Thu Feb 12 23:09:17 2015
##################################################
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import filter
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
class test_large_decimation_crash_firfilter_cc(gr.top_block):
def __init__(self, decimation=524288):
gr.top_block.__init__(self, "integration block with large decimation segfaults")
##################################################
# Parameters
##################################################
self.decimation = decimation
##################################################
# Blocks
##################################################
self.null_source = blocks.null_source(gr.sizeof_gr_complex*1)
self.null_sink = blocks.null_sink(gr.sizeof_gr_complex*1)
self.low_pass_filter = filter.fir_filter_ccf(decimation, firdes.low_pass(
1, 1, 0.25, 0.125, firdes.WIN_HAMMING, 6.76))
##################################################
# Connections
##################################################
self.connect((self.low_pass_filter, 0), (self.null_sink, 0))
self.connect((self.null_source, 0), (self.low_pass_filter, 0))
def get_decimation(self):
return self.decimation
def set_decimation(self, decimation):
self.decimation = decimation
if __name__ == '__main__':
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
parser.add_option("-d", "--decimation", dest="decimation", type="intx", default=524288,
help="Set decimation. 524287 succeeds but 524288 and above fails with segfault [default=%default]")
(options, args) = parser.parse_args()
tb = test_large_decimation_crash_firfilter_cc(decimation=options.decimation)
tb.start()
tb.wait()
#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: integration block with large decimation segfaults
# Author: Martin Dudok van Heel
# Description: an integrate block crashes with segfault with decimation 262144 or above. Probably accessing input buffer outside valid region.
# Generated: Thu Feb 12 23:09:50 2015
##################################################
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import filter
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
class test_large_decimation_crash_firfilter_ff(gr.top_block):
def __init__(self, decimation=262144):
gr.top_block.__init__(self, "integration block with large decimation segfaults")
##################################################
# Parameters
##################################################
self.decimation = decimation
##################################################
# Blocks
##################################################
self.null_source = blocks.null_source(gr.sizeof_float*1)
self.null_sink = blocks.null_sink(gr.sizeof_float*1)
self.low_pass_filter = filter.fir_filter_fff(decimation, firdes.low_pass(
1, 1, 0.25, 0.125, firdes.WIN_HAMMING, 6.76))
##################################################
# Connections
##################################################
self.connect((self.low_pass_filter, 0), (self.null_sink, 0))
self.connect((self.null_source, 0), (self.low_pass_filter, 0))
def get_decimation(self):
return self.decimation
def set_decimation(self, decimation):
self.decimation = decimation
if __name__ == '__main__':
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
parser.add_option("-d", "--decimation", dest="decimation", type="intx", default=262144,
help="Set decimation. 262143 succeeds but 262144 and above fails with segfault [default=%default]")
(options, args) = parser.parse_args()
tb = test_large_decimation_crash_firfilter_ff(decimation=options.decimation)
tb.start()
tb.wait()
#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: integration block with large decimation segfaults
# Author: Martin Dudok van Heel
# Description: an integrate block crashes with segfault with decimation 262144 or above. Probably accessing input buffer outside valid region.
# Generated: Thu Feb 12 22:58:34 2015
##################################################
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
class test_large_decimation_crash_integrate_ff(gr.top_block):
def __init__(self, decimation=262144):
gr.top_block.__init__(self, "integration block with large decimation segfaults")
##################################################
# Parameters
##################################################
self.decimation = decimation
##################################################
# Blocks
##################################################
self.null_source = blocks.null_source(gr.sizeof_float*1)
self.null_sink = blocks.null_sink(gr.sizeof_float*1)
self.integrate_ff = blocks.integrate_ff(decimation)
##################################################
# Connections
##################################################
self.connect((self.integrate_ff, 0), (self.null_sink, 0))
self.connect((self.null_source, 0), (self.integrate_ff, 0))
def get_decimation(self):
return self.decimation
def set_decimation(self, decimation):
self.decimation = decimation
if __name__ == '__main__':
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
parser.add_option("-d", "--decimation", dest="decimation", type="intx", default=262144,
help="Set decimation. 262143 succeeds but 262144 and above fails with segfault [default=%default]")
(options, args) = parser.parse_args()
tb = test_large_decimation_crash_integrate_ff(decimation=options.decimation)
tb.start()
tb.wait()
#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: integration block with large decimation segfaults
# Author: Martin Dudok van Heel
# Description: an integrate block crashes with segfault with decimation 262144 or above. Probably accessing input buffer outside valid region.
# Generated: Thu Feb 12 23:09:59 2015
##################################################
from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
class test_large_decimation_crash_integrate_ss(gr.top_block):
def __init__(self, decimation=131072):
gr.top_block.__init__(self, "integration block with large decimation segfaults")
##################################################
# Parameters
##################################################
self.decimation = decimation
##################################################
# Blocks
##################################################
self.null_source = blocks.null_source(gr.sizeof_short*1)
self.null_sink = blocks.null_sink(gr.sizeof_short*1)
self.integrate_ff = blocks.integrate_ss(decimation)
##################################################
# Connections
##################################################
self.connect((self.integrate_ff, 0), (self.null_sink, 0))
self.connect((self.null_source, 0), (self.integrate_ff, 0))
def get_decimation(self):
return self.decimation
def set_decimation(self, decimation):
self.decimation = decimation
if __name__ == '__main__':
parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
parser.add_option("-d", "--decimation", dest="decimation", type="intx", default=131072,
help="Set decimation. 131071 succeeds but 131072 and above crashes with segfault [default=%default]")
(options, args) = parser.parse_args()
tb = test_large_decimation_crash_integrate_ss(decimation=options.decimation)
tb.start()
tb.wait()
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio