[mythtv] Backend segfaulting repeatedly during recording DVB

Tj htpc at treblid.dyndns.org
Wed Feb 23 02:47:25 UTC 2005


Ed Wildgoose wrote:

> Well, I already worked out that much, but when I look at the code, it 
> looks fine to me?  Can't see what's uninitialised here?
>
>        struct statfs statbuf;
>        if (statfs(recordfileprefix.ascii(), &statbuf) == 0)
>        {
>            freeSpace = statbuf.f_bavail / (1024*1024/statbuf.f_bsize);
>        }
>
statbuf is declared and straightaway used in the if () condition. This 
should probably be allright since it's sort of a returned value. I guess 
if we set all the values in statbuf to 0 will kill the valgrind message. 
What I dun understand why my backtrace shows the if() condition 
sometimes when it crashes, and a corrupted stack message.

Do you remember when you do declare a variable as such, is it declared 
in the heap or stack?

Initially I thought "recordfileprefix.ascii()" is invalid or 
statbuf.f_bsize is 0, both doesn't seem to be the case.

Maybe try declaring statbuf as a pointer and alloc some memory to it? Or 
use auto_ptr if possible, and see if it stops the problem? Though I have 
no idea what difference it would make. The problem appears to be 
somewhere else.

>
> Yeah, I already applied your suggestions, but it makes no difference.  
> I think we should apply the delete[] changes, but I have seen several 
> references which says they are identical functions under linux, it's 
> just that they cause crashes on other operating systems...
>
So it's not that part causing the problem... What's the backtrace like?

>
>    // Record all streams flagged for recording
>    bool need_pcr_pid = true;
>    QValueList<ElementaryPIDObject>::const_iterator es;
>    for (es = m_pmt.Components.begin(); es != m_pmt.Components.end(); 
> ++es)
>    {
>        if ((*es).Record)
>        {
>            OpenFilters((*es).PID, (*es).Type);
>
>            if ((*es).PID == m_pmt.PCRPID)
>                need_pcr_pid = false;
>        }
>    }
>
>
> Interestingly though I can't make the darn thing crash under 
> valgrind...  Now, I *think* valgrind might be enforcing some strict 
> 32bit alignment on memory accesses or similar?  If my crashes were an 
> "off by one" kind of bug, then this extra buffer might explain why 
> it's not dying under valgrind (not sure why it's not getting caught 
> though).
>
I think valgrind should trap buffer overflows.


> It dies happily under gdb and run standalone, both with debug and 
> release compile flags.  I can't quite see what gcc flags I would want 
> to emulate the valgrind memory accesses though.  Perhaps 
> "|-mpreferred-stack-boundary"?
>
One thing I'm always too lazy to do is to compile QT as debug for more 
informative backtraces. Do you think that will help? Also found out that 
we should turn off all gcc optimisations stuffs for valgrind to better 
trap errors.

> Grateful for any suggestions on gcc flags.  This would at least allow 
> me to narrow it down to a memory problem with something getting 
> trampled...  Perhaps it's possible in gdb to find out who owns the 
> variable above or below a given memory address?

Can you do that? Frankly I dun use gdb much so I dun really know how to 
use it.. :) I should learn to use gdb.. hee hee:)

Also, what did you do to make mythbackend crash? Did you find a reliable 
way? I always have to wait at least 2 days before it crashes, and 
debugging is slow as I have no idea how to crash it.

If only two of us are having this problems, I would think it's something 
else, like buggy a buggy c library or something we both happen to use :(...


Regards.



More information about the mythtv-dev mailing list