[Freeswitch-users] Advise on FS core dump

Stephen Wilde wstephen80 at gmail.com
Mon Oct 24 14:10:23 MSD 2011


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 at 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 at 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 at 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 at 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 at 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 at 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 at freeswitch bin]#
>>>
>>> --
>>> Regards,
>>> Charles
>>>
>>>
>>>
>>> FreeSWITCH-users mailing list
>>> FreeSWITCH-users at 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 at 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 at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
> http://www.freeswitch.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20111024/3e4020f6/attachment-0001.html 


Join us at ClueCon 2011 Aug 9-11, 2011
More information about the FreeSWITCH-users mailing list