Page Fault

Tiago Jorge tjpj at lasige.di.fc.ul.pt
Wed Mar 16 16:33:49 CET 2005


Frank Mehnert wrote:

>On Wednesday 16 March 2005 14:41, Tiago Jorge wrote:
>  
>
>>>>01d00244        add    $0xc,%esp
>>>>01d00247        push   $0x0
>>>>01d00249        push   $0x2
>>>>01d0024b        push   $0x2
>>>>01d0024d        call   0x1d01300 <socket>
>>>>01d00252        add    $0x10,%esp
>>>>01d00255        test   %eax,%eax
>>>>01d00257        mov    %eax,(%ebx) <--- ERROR HERE!!!!!!
>>>>01d00259        js     0x1d00344
>>>>/home/tiago/l4/pkg/failuredetector/server/src/FailureDetector.cc:38
>>>>        
>>>>
>>>That means that the return value of the socket() call is stored somewhere
>>>(in sock_fd). What ist sock_fd -- an object variable, a local variable or
>>>a global variable?
>>>      
>>>
>>thats true. sock_fd is an object variable. the definition of the class
>>is the following:
>>    
>>
>
>Where is the related object initialized? Add a printf()-statement to the
>constructor of FailureDetector and see if the output of that statement
>occurs _before_ the error.
>
>Frank
>  
>

ok...
i've added some debug and you are right. the error is on the call of the 
socket function. the constructor is right. here is the code of the 
constructor:

FailureDetector::FailureDetector(int new_eid,
                                 int new_sleep_time,
                                 vector<int> *new_group,
                                 //pthread_mutex_t *new_group_lock){
                                                                 
l4lock_t *new_group_lock){
  eid = new_eid;
  sleep_time = new_sleep_time;
  group = new_group;
  group_lock = new_group_lock;
  trueFlag_fd = 0x1;
  stop_flag = false;
  sock_fd=0;

  LOG("Before start thread\n");
  fdect = l4thread_create(helper_failure_detector, NULL, 
L4THREAD_CREATE_ASYNC);
  LOG("After start thread\n");
}

it passes ok...

then he executes this code:

void FailureDetector::failureDetector(){
  heartbeat hb;
  bool recvfrom_error = false;
  map<int,heartbeat> received;
  map<int,heartbeat> pre_suspicious;

  /*initialization procedures*/
  //pthread_mutex_init(&lock_suspected, NULL);
  //pthread_mutex_init(&lock_stop, NULL);
  LOG("before initialize_comm_fd()\n");
  initialize_comm_fd();

[...]

and the initialize_comm_fd bugs out. here is the code:

void FailureDetector::initialize_comm_fd(){
  int flags=0, s=0;

  LOG("before socket\n");
  /* Create socket from which to send */
  if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { <--- ERROR!!!!!
      LOG("socket error\n");
  }
  LOG("after socket\n");
[...]

you can see there the s variable. if i use s, it works out fine because 
its a local variable, but breaks in the next line. sock_fd and the 
variable in the next line are private attributes of the class, as you 
can see here:

[...]

extern "C"{
  #include <stdio.h>
  #include <string.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <fcntl.h>
  #include <netdb.h>
  #include <l4/lock/lock.h>
  #include <l4/names/libnames.h>
  #include <l4/log/l4log.h>
}

#define PORTNUMBER 45555

#define NULL 0

using namespace std;

struct heartbeat{
  int eid;
};

class FailureDetector{

private:
  int sock_fd; <--- here it is...
  socklen_t addrLength_fd;
  struct sockaddr_in destinationAddr_fd;
  struct sockaddr_in myAddr_fd;
  struct sockaddr_in responseAddr_fd;
  int trueFlag_fd;
  map<int,heartbeat> suspected;
[...]

so... whats wrong :) ???

thanks

Tiago





More information about the l4-hackers mailing list