ORBit2 Segfault - was Re: [PATCH] bad ...



Michael Meeks wrote:

>>With ORBit2 I must be missing something.  When I build a test 
>>client/server (echo clone) pair with ORBit everything is fine.  I then 
>>make changes to the compile/link process to get it to build with ORBit2. 
>>  When I run it seg faults and dies, both client and server sides.  It's 
>>somewhere inside of CORBA_ORB_init().
> 
> 
> 	That sounds horrendous; can you post your code, and a stack trace I
> imagine something daft is being done - given that all of Gnome 2.2 is
> using ORBit2-2.4.1 :-)
> 
> 	There are some changes to the CORBA spec from ORBit-0.5 to ORBit2,
> which may be affecting you but ... let's see the code.
> 
> 	Regards,
> 
> 		Michael.
> 

Attached are the makefile, server, client, and idl source files.  The 
orbtrace file is from an "strace -o orbtrace orb_echo_server" run, the 
client segfaults at the same trace point.

Manual operations to switch versions.

In the makefile, uncomment/comment macros near top.

In the .c files, change include <orb/...> to <orbit/...> depending on build.

After running "make newskel", add the line "g_message("[server] %s", 
input);" to impl_Echo_echoString() in orb_echo-skelimpl.c.

There's an I'm here scaffold in the server source blocked by "DEBUG" 
comments.

TIA,
-- 
Greg Edwards
New Age Software, Inc. - http://www.nas-inet.com
======================================================
Galactic Outlaw        - http://goutlaw.nas-inet.com
   The ultimate cyberspace adventure!

makefile

interface Echo 
{
  void echoString(in string input);
};

/*
 * MyFirstOrbit program. Client. Hacked by Ewan Birney
 * birney@sanger.ac.uk from echo test suite.
 *
 */

#include <stdio.h>
#include <orbit/orbit.h>

/*
 * This header file was generated from the idl
 */

#include "orb_echo.h"

/*
 * This is our Echo Object
 */

Echo echo_client;

int
main (int argc, char *argv[])
{
    CORBA_Environment ev;
    CORBA_ORB orb;

    FILE * ifp;
    char * ior;
    char filebuffer[1024];

    /*
     * Standard initalisation of the orb. Notice that
     * ORB_init 'eats' stuff off the command line
     */

    CORBA_exception_init(&ev);
    orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);

    /*
     * Get the IOR (object reference). It should be written out
     * by the echo-server into the file echo.ior. So - if you
     * are running the server in the same place as the client,
     * this should be fine!
     */

    ifp = fopen("echo.ior","r");
    if( ifp == NULL ) {
      g_error("No echo.ior file!");
      exit(-1);
    }

    fgets(filebuffer,1023,ifp);
    ior = g_strdup(filebuffer);

    fclose(ifp);

    /*
     * Actually get the object. So easy!
     */

    echo_client = CORBA_ORB_string_to_object(orb, ior, &ev);
    if (!echo_client) {
        printf("Cannot bind to %s\n", ior);
        return 1;
    }

    /*
     * Ok. Now we use the echo object...
     */

    printf("Type messages to the server\n. as the only thing on the line stops\n");
    while( fgets(filebuffer,1024,stdin) ) {
      if( filebuffer[0] == '.' && filebuffer[1] == '\n' ) 
        break;

      /* chop the newline off */
      filebuffer[strlen(filebuffer)-1] = '\0';
      
      /* using the echoString method in the Echo object               */
      /* this is defined in the echo.h header, compiled from echo.idl */

      Echo_echoString(echo_client,filebuffer,&ev);

      /* catch any exceptions (eg, network is down) */

      if(ev._major != CORBA_NO_EXCEPTION) {
        printf("we got exception %d from echoString!\n", ev._major);
        return 1;
      }
    }
      
    /* Clean up */
    CORBA_Object_release(echo_client, &ev);
    CORBA_Object_release((CORBA_Object)orb, &ev);

    return 0;
}
/*
 * MyFirstOrbit program - server. Hacked
 * from Echo test suite by birney@sanger.ac.uk
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <orbit/orbit.h>
#include "orb_echo.h"

#include "orb_echo-skelimpl.c"

/* This is so we can get out a valid IOR later... */
Echo echo_client = CORBA_OBJECT_NIL;

/*
 * extern void impl_Echo_echoString(PortableServer_Servant *,CORBA_char *,CORBA_Environment *);
 */

/*
static void
do_echoString(PortableServer_Servant servant,
              CORBA_char *astring,
              CORBA_Environment *ev);
*/

/*
 * I have **no** idea what this bit does
 */
PortableServer_ServantBase__epv base_epv = {
  NULL,
  NULL,
  NULL
};
/* POA_Echo__epv echo_epv = { NULL, (void *)&do_echoString }; */
POA_Echo__epv echo_epv = { NULL, (void *)&impl_Echo_echoString };
POA_Echo__vepv poa_echo_vepv = { &base_epv, &echo_epv };
POA_Echo poa_echo_servant = { NULL, &poa_echo_vepv };

int
main (int argc, char *argv[])
{
    PortableServer_ObjectId objid = {0, sizeof("myEchoString"), "myEchoString"};
    PortableServer_POA poa;

    CORBA_Environment ev;
    char *retval;
    CORBA_ORB orb;
    FILE * ofp;

    signal(SIGINT, exit);
    signal(SIGTERM, exit);

/* DEBUG */
printf("this prints\n");
/* DEBUG */

    CORBA_exception_init(&ev);

/* DEBUG */
printf("this prints\n");
/* DEBUG */

    orb = CORBA_ORB_init(&argc, argv, "orbit-local-orb", &ev);

/* DEBUG */
printf("this does not\n");
/* DEBUG */

    POA_Echo__init(&poa_echo_servant, &ev);

    poa = (PortableServer_POA)CORBA_ORB_resolve_initial_references(orb, "RootPOA", &ev);
    PortableServer_POAManager_activate(PortableServer_POA__get_the_POAManager(poa, &ev), &ev);
    PortableServer_POA_activate_object_with_id(poa,
                                               &objid, &poa_echo_servant, &ev);

    echo_client = PortableServer_POA_servant_to_reference(poa,
                                                          &poa_echo_servant,
                                                          &ev);
    if (!echo_client) {
        printf("Cannot get objref\n");
        return 1;
    }

    retval = CORBA_ORB_object_to_string(orb, echo_client, &ev);

    ofp = fopen("echo.ior","w");

    fprintf(ofp,"%s", retval);
    fclose(ofp);

    CORBA_free(retval);

    fprintf(stdout,"Written the file echo.ior with the IOR of this server.\n Now waiting for requests...\n");
    fflush(stdout);
    CORBA_ORB_run(orb, &ev);

    return 0;
}

/*
static void
do_echoString(PortableServer_Servant servant,
              CORBA_char *astring,
              CORBA_Environment *ev)
{
  g_message("[server] %s", astring);
  return;
}
*/

orbtrace



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]