ASE Home Page Products Download Purchase Support About ASE
ChartDirector Support
Forum HomeForum Home   SearchSearch

Message ListMessage List     Post MessagePost Message

  Crash in chartdir60.dll on adding a dataset to a line layer
Posted by Martin on Jul-31-2019 17:02
We are using Chartdir Version 6.3.0.0 with Qt 5.9.2, and on rare occasions we get an application crash with the lines:

DoubleArray chan_y_array = DoubleArray(p_chan_y_values->data(), p_chan_y_values->length());
DataSet* p_y_data_set = p_linelayer_y->addDataSet(chan_y_array, channel_color_line_style);// <-access violation on reading from memory in this line, 6 stack frames inside chartdir60.dll

where p_chan_y_values is a QVector<double>* with 2 values. All I get is an Exception on accessing a memory area I don't have access to from the application's code.

The crash happens in productive code, it's hard to reproduce. All I have at the moment is a 700MB crash dump file with which I can't read every memory location, but at least it doesn't look like exhausted or corruped memory.

Any idea how to track the root cause of this error?

  Re: Crash in chartdir60.dll on adding a dataset to a line layer
Posted by Peter Kwan on Jul-31-2019 20:14
Hi Martin,

Is the program multi-threading? From experience, in many case, these sort of issues can be due to race conditions in GUI programs. The key things to note in a GUI program is:

(a) All GUI elements (controls, widgets, etc) must run in the GUI thread (the thread that creates the GUI element). It is usually the main thread.

(b) All events (mouse events, keyboard events, etc) occurs in the GUI thread.

(c) That means any code that uses the GUI, and code that runs in event or signal handlers, must not access variables or objects created in another thread unless probably synchronized (with mutex, etc).

For your case, if p_chan_y_values is created in another thread, but the charting code is running in an event handler (such as in response to a button click or GUI timer or mouse or keyboard action), and there is no mutex or any synchronization between the threads for p_chart_y_values, this can cause this type of issues.

For debugging, try to modify the code as follows:

// This is a dummy line to verify that p_linelayer_y is not pointing to invalid memory.
p_linelayer_y->setFastLineMode(true);

// Copy the data to stack variables. This is to check the vector is valid.
double *data = p_chan_y_values->data();
std::vector temp(data, data + p_chan_y_values->length());
int lineColor = channel_color_line_style;

// Check the data values to for any other abnormal things
bool isValid = true;
for (int i = 0; isValid && (i < (int)temp.size()); ++i)
    isValid = (i < 2) && ((temp[i] == Chart::NoValue) || ((temp[i] < 1E20) && (temp[i] > -1E20)));

DataSet* p_y_data_set = 0;
if (isValid)
    p_y_data_set = p_linelayer_y->addDataSet(DoubleArray(&(temp[0]), temp.size()), lineColor);

if (p_y_data_set == 0)
{
     assert(false);   // This line will break the code in debug mode
     // In release mode, the error will be displayed in the chart title
     c->addTitle("Abnormal Values Detected");
}

Regards
Peter Kwan