Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Segmentation fault on one Linux machine but not another with C++ code

I have been having a peculiar problem. I have developed a C++ program on a Linux cluster at work. I have tried to use it home on an Ubuntu 14.04 machine, but the program, which is composed of 6 files: main.hpp,main.cpp (dependent on) sarsa.hpp,sarsa.cpp (class Sarsa) (dependent on) wec.hpp,wec.cpp, does compile, but when I run it it either returns segmenation fault or does not enter one fundamental function of the class Sarsa.

The main code calls the constructor and setter functions without problems:

  Sarsa run;
  run.setVectorSize(memory,3,tilings,1000);

etc.

However, it cannot run the public function episode , since learningRate, which should contain a large integer, returns 0 for all episodes (iterations).

learningRate[episode]=run.episode(numSteps,graph);}

I tried to debug the code with gdb, which has returned:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000408f4a in main () at main.cpp:152
152     learningRate[episode]=run.episode(numSteps,graph);}

I also tried valgrind, which returned:

==10321==  Uninitialised value was created by a stack allocation
==10321==    at 0x408CAD: main (main.cpp:112)

But no memory leakage issues.

I was wondering if there was a setting to try to debug the external file sarsa.cpp, since I think that class is likely to be the culpript

In the file, I use C++v11 language (I would be expecting errors at compile-time,though), so I even compiled with g++ -std=c++0x, but there were no improvements.

Unluckily, because of the size of the code, I cannot post it here. I would really appreciate any help with this problem. Am I missing anything obvious? Could you help me at least with the debugging?

Thank you in advance for the help.

Correction: main.cpp:

Definition of the global array: `#define numEpisodes 10

int learningRate[numEpisodes];`

Towards the end of the main function:

for (int episode; episode<numEpisodes; episode++) { if (episode==(numEpisodes-1)) { // Save the simulation data only at the graph=true;} // last episode learningRate[episode]=run.episode(numSteps,graph);}

like image 697
Enrico Anderlini Avatar asked May 15 '15 17:05

Enrico Anderlini


People also ask

Why do I keep getting segmentation fault in C?

In practice, segfaults are almost always due to trying to read or write a non-existent array element, not properly defining a pointer before using it, or (in C programs) accidentally using a variable's value as an address (see the scanf example below).

What is the solution for segmentation fault in C?

It can be resolved by having a base condition to return from the recursive function. A pointer must point to valid memory before accessing it.

What is segmentation fault C Linux?

Segmentation fault means your program accessed or executed invalid memory. You've got a bug. Seeing some code might help people analyze it but first you should run a debugger on it to see if you can figure it out for yourself.


2 Answers

As the code you just added to the question reveals, the problem arises because you did not initialize the episode variable. The behavior of any code that uses its value before you assign one is undefined, so it is entirely reasonable that the program behaves differently in one environment than in another.

like image 182
John Bollinger Avatar answered Oct 11 '22 08:10

John Bollinger


A segmentation fault indicates an invalid memory access. Usually this means that somewhere, you're reading or writing past the end of an array, or through an invalid pointer, or through an object that has already been freed. You don't necessarily get the segmentation fault at the point where the bug occurs; for instance, you could write past the end of an array onto heap metadata, which causes a crash later on when you try to allocate or release an unrelated object. So it's perfectly reasonable for a program to appear to work on one system but crash on another.

In this case, I'd start by looking at learningRate[episode]. What is the value of episode? Is it within the bounds of learningRate?

like image 42
user3553031 Avatar answered Oct 11 '22 08:10

user3553031