You can issue a:

gdb -c core.xxx freeswitch

in freeswitch bin directory where core.xxx is the name of the generated core dump then, in gdb:

bt full

to show the stack backtrace

On Mon, Oct 24, 2011 at 11:53 AM, fieldpeak <fieldpeak@gmail.com> wrote:
Hi Stephen,

Thanks for your kindly help, however, i changed it as your advise, the core still dumped.

below is the updated code,


static switch_status_t check_billing_before_routing(switch_core_session_t *session)
{
    //charles, check billing before routing the call
   
    char buf[128];
    char cmd[100];

    FILE *pp = NULL;

    const char* in_username = NULL;
    const char* in_calledstation = NULL;
    const char* in_uniqueid = NULL;
    const char* in_network_addr = NULL;
    const char* in_type = "9";
    int is_b;
   
    //const char* full_cmd;
    int i_continue = 1;
    switch_channel_t *channel = NULL;


    in_uniqueid = switch_core_session_get_uuid(session);
   
    channel = switch_core_session_get_channel(session);

    /*only billing on a leg*/
    is_b = channel && switch_channel_get_originator_caller_profile(channel);
    printf("is_b is: %d\n", is_b);
    if(is_b)
    {
    return SWITCH_STATUS_SUCCESS;
    }

    /* Lock this session's data for this module while we tinker with it */
    if (globals.mutex) {
        switch_mutex_lock(globals.mutex);
    }
   
   
    in_username = switch_channel_get_variable(channel, "caller_id_number");
    in_calledstation = switch_channel_get_variable(channel, "destination_number");
    in_network_addr = switch_channel_get_variable(channel, "network_addr");

   
    /* Done checking - release lock */
    if (globals.mutex) {
        switch_mutex_unlock(globals.mutex);
    }
   

    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "check_billing_before_routing, in_username: %s, in_calledstation: %s, in_uniqueid: %s in_type: %s, in_network_addr: %s \n", in_username, in_calledstation, in_uniqueid, in_type, in_network_addr);
   
    strcpy(cmd,"");
    strcat(cmd, "check_billing_before_answer");

    strcat(cmd, " ");
    strcat(cmd, in_username);
    strcat(cmd, " ");
    strcat(cmd, in_calledstation);
    strcat(cmd, " ");
    strcat(cmd, in_uniqueid);
    strcat(cmd, " ");
    strcat(cmd, in_type);
    strcat(cmd, " ");
    strcat(cmd, in_network_addr);

    printf("excute external cmd: ");
    printf(cmd);
    printf("\n");

    if( (pp = popen(cmd, "r")) == NULL )
    {
        printf("popen() error!\n");
        exit(1);
    }

    while(fgets(buf, sizeof buf, pp))
    {
        printf("the result of excuting external cmd: %s", buf);
    }

    if(pp)
    {
        pclose(pp);
    }

    i_continue =  atoi(buf);

    printf("i_continue: %d", i_continue);


    if (!i_continue) {
       
        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "call was not authorized to continue \n");
   
        transfer_call(session, globals.nobal_action);
    }

   


    return SWITCH_STATUS_SUCCESS;

}


2011/10/24 Stephen Wilde <wstephen80@gmail.com>
Can you try to change the allocation of cmd as:

char cmd[100];

....

strcat(cmd, "check_billing_before_answer ");

strcat(cmd, in_username);

strcat(cmd, " ");


....


On Mon, Oct 24, 2011 at 10:39 AM, fieldpeak <fieldpeak@gmail.com> wrote:
Hi Friends,

i'm using mod_nibblebill for billing on FS, i bundled event processing
fucntions when status change,
e.g. /* on_routing */ check_billing_before_routing,
and * on_hangup */ process_hangup, as below,
however, i found if i make a call containing two-legs e.g. user 1001 call user 1002, then the FS core dump. but if i only make one leg call, e.g. call 888 for IVR, then no problem occure, i found the problem within function "check_billing_before_routing" (because once i comment all of lines within this func, the core did not dump). below is the func "check_billing_before_routing", can anyone help advise what's wrong? how should i correct it, thanks.

static switch_status_t check_billing_before_routing(switch_core_session_t *session)
{
    //charles, check billing before routing the call
   
    char buf[128];
    char cmd[100] = "check_billing_before_answer";
    FILE *pp = NULL;

    const char* in_username = NULL;
    const char* in_calledstation = NULL;
    const char* in_uniqueid = NULL;
    const char* in_network_addr = NULL;
    const char* in_type = "9";
    int is_b;
   
    //const char* full_cmd;
    int i_continue = 1;
    switch_channel_t *channel = NULL;


    in_uniqueid = switch_core_session_get_uuid(session);
   
    channel = switch_core_session_get_channel(session);

    /*only billing on a leg*/
    is_b = channel && switch_channel_get_originator_caller_profile(channel);
    printf("is_b is: %d\n", is_b);
    if(is_b)
    {
    return SWITCH_STATUS_SUCCESS;
    }

    /* Lock this session's data for this module while we tinker with it */
    if (globals.mutex) {
        switch_mutex_lock(globals.mutex);
    }
   
   
    in_username = switch_channel_get_variable(channel, "caller_id_number");
    in_calledstation = switch_channel_get_variable(channel, "destination_number");
    in_network_addr = switch_channel_get_variable(channel, "network_addr");

   
    /* Done checking - release lock */
    if (globals.mutex) {
        switch_mutex_unlock(globals.mutex);
    }
   

    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "check_billing_before_routing, in_username: %s, in_calledstation: %s, in_uniqueid: %s in_type: %s, in_network_addr: %s \n", in_username, in_calledstation, in_uniqueid, in_type, in_network_addr);
   

    strcat(cmd, " ");
    strcat(cmd, in_username);
    strcat(cmd, " ");
    strcat(cmd, in_calledstation);
    strcat(cmd, " ");
    strcat(cmd, in_uniqueid);
    strcat(cmd, " ");
    strcat(cmd, in_type);
    strcat(cmd, " ");
    strcat(cmd, in_network_addr);

    printf("excute external cmd: ");
    printf(cmd);
    printf("\n");

    if( (pp = popen(cmd, "r")) == NULL )
    {
        printf("popen() error!\n");
        exit(1);
    }

    while(fgets(buf, sizeof buf, pp))
    {
        printf("the result of excuting external cmd: %s", buf);
    }

    if(pp)
    {
        pclose(pp);
    }

    i_continue =  atoi(buf);

    printf("i_continue: %d", i_continue);


    if (!i_continue) {
       
        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO, "call was not authorized to continue \n");
   
        transfer_call(session, globals.nobal_action);
    }

   


    return SWITCH_STATUS_SUCCESS;

}


Core dump logs:

freeswitch@freeswitch> 2011-10-24 16:30:26.583369 [NOTICE] mod_xml_rpc.c:969 Starting HTTP Port 8787, DocRoot [/usr/local/freeswitch/htdocs]
2011-10-24 16:30:29.454743 [WARNING] sofia_reg.c:1337 SIP auth challenge (INVITE) on sofia profile 'internal' for [6628@224.193.106.204] from ip 223.128.70.10
2011-10-24 16:30:30.254710 [NOTICE] switch_channel.c:897 New Channel sofia/internal/8068@224.193.106.204 [196a50b8-eaa0-4ef0-a674-18602117f5ec]
is_b is: 0
excute external cmd: check_billing_before_answer 8068 6628 196a50b8-eaa0-4ef0-a674-18602117f5ec 9 223.128.70.10
2011-10-24 16:30:30.254710 [INFO] mod_nibblebill.c:1017 check_billing_before_routing, in_username: 8068, in_calledstation: 6628, in_uniqueid: 196a50b8-eaa0-4ef0-a674-18602117f5ec in_type: 9, in_network_addr: 223.128.70.10
the result of excuting external cmd:
the result of excuting external cmd: 60
Segmentation fault (core dumped)
[root@freeswitch bin]#

--
Regards,
Charles



FreeSWITCH-users mailing list
FreeSWITCH-users@lists.freeswitch.org
http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
http://www.freeswitch.org




FreeSWITCH-users mailing list
FreeSWITCH-users@lists.freeswitch.org
http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
http://www.freeswitch.org




--
Regards,
Charles



FreeSWITCH-users mailing list
FreeSWITCH-users@lists.freeswitch.org
http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
http://www.freeswitch.org