random segfault

I appear to be encountering a very odd segfault. I have this method, and some odd output.
Methods:

string ZomBDashboard::GetString(string name)
{
    if (src != NULL)
    {
        debugf("Getting string.. (Deref: %p;", src);
        System451::Communication::Dashboard::ZomBTCPSource &ts = *((System451::Communication::Dashboard::ZomBTCPSource*)src);
        debugf(" deref OK, con: %d)", ts.connected);
        return ts.Get(name);//or, src->Get(name)
    }
    return "";
}
...
const char* System451::Communication::Dashboard::ZomBTCPSource::Get(string name)
{
    debugf(". in, 
");
    Synchronized sync (sink);
    return curvalues[name];
}

Output:

Getting string.. (Deref: 0xsomememoryaddressthatappearsvalid; deref OK, con: 4)

data access
(generic vxworks error info)

and sometimes

Getting string.. (Deref: 0xsomememoryaddressthatappearsvalid;

data access
(generic vxworks error info)

I tried using Debug Kernel Task, but WR just paused updating all the panels to new info, so it was essentially useless.

The robot code is attached in MyRobot.cpp and the C++ Bindings folder. The dashboard is Dashboard.exe and ZomB.dll (you might have to launch it twice), and when all is working, moving the slider on the left should move the slider on the right.

if you feel like compiling ZomB, download all the code (in the trunk) at http://firstforge.wpi.edu/integration/viewcvs/viewcvs.cgi/?root=zomb&system=exsy1002 and copy the DashboardDataHub.cs in the zip into ZomBdll\NetAndDataProcessing

debug stuff.zip (3.91 MB)


debug stuff.zip (3.91 MB)

I’ve debugged it some more, and I am completely confused.
a variable is changing its address without being updated!
I have the src variable, which is a pointer to a interface, and is assigned either null, or a new TCPsender. I then print out the pointer address, and it looks good.
Later, after i’m enabled and in the telop function, I call GetString, and print out the address, then try to deref src, and ultimatly fail because somehow, src changed even though those are the only two active lines of code that reference src.
Output attached (how does one copy and paste the text from the NetConsole? I could not get a sticking selection)
Code:

        void OperatorControl(void)
        {
            cerr<<"IN oc"<<endl;
            int loops=0;
            while (IsEnabled())
            {
                cerr<<"looping";
                cerr<<zb.GetString("ival")<<endl;
            }
        }

Constructor


    if ((mode & RemoteData) == RemoteData)
        src = new System451::Communication::Dashboard::ZomBTCPSource();
    else
        src = 0;
    debugf("init: src=%p
", src);
string ZomBDashboard::GetString(string name)
{
    if (src)
    {
        debugf("
gsi: src=%p
", src);
        return src->Get(name);
    }
    return "";
}
```<br><br>![ncpointererr.PNG|690x500](upload://oPDwSgbmBjkFszjkBt4RSBly5xt.png.png)<br><br><br>![ncpointererr.PNG|690x500](upload://oPDwSgbmBjkFszjkBt4RSBly5xt.png.png)<br>

Ah! Copy constructors! gotta love (read: hate) them!

Just select the text… when you let go, it’s copied. To paste, middle click.

-Joe

By the way, the reason for this is so that you can hit <ctrl-c> and it will send that code to the cRIO instead of being processed by the console window.