[Freeswitch-users] Advise on FS core dump

fieldpeak fieldpeak at gmail.com
Tue Oct 25 06:38:26 MSD 2011


Hi Stephen,

Thanks for your advise, i tried it, i issued below commands, however, i did
not find any core named files under freeswitch bin directory, and below is
the screen showing, i could you identify the root cause, could you please
help, thanks a lot!

gdb -c core.xxx freeswitch
ddb>run
...(fs running up)
gdb>bt full

freeswitch at freeswitch> 2011-10-25 10:30:44.161051 [WARNING] sofia_reg.c:1337
SIP auth challenge (INVITE) on sofia profile 'internal' for [
13910936628 at 124.193.106.104] from ip 222.128.70.10
2011-10-25 10:30:45.081037 [NOTICE] switch_channel.c:897 New Channel
sofia/internal/13580358068 at 124.193.106.104[38946a57-c673-4705-8433-36f4b066d01c]
[New Thread 0xb71d6b90 (LWP 19991)]
is_b is: 0
excute external cmd: check_billing_before_answer 13580358068 13910936628
38946a57-c673-4705-8433-36f4b066d01c 9 222.128.70.10
2011-10-25 10:30:45.081037 [INFO] mod_nibblebill.c:1017
check_billing_before_routing, in_username: 13580358068, in_calledstation:
13910936628, in_uniqueid: 38946a57-c673-4705-8433-36f4b066d01c in_type: 9,
in_network_addr: 222.128.70.10
Detaching after fork from child process 19992.
the result of excuting external cmd:
the result of excuting external cmd: 60

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb71d6b90 (LWP 19991)]
0x008ff698 in switch_core_get_state_handler at plt () from
/usr/local/freeswitch/lib/libfreeswitch.so.1
(gdb) bt full
#0  0x008ff698 in switch_core_get_state_handler at plt ()
   from /usr/local/freeswitch/lib/libfreeswitch.so.1
No symbol table info available.
#1  0x0092d558 in switch_core_session_run (session=0x81bc238) at
src/switch_core_state_machine.c:373
        global_proceed = 1
        proceed = <value optimized out>
        ptr = <value optimized out>
        rstatus = <value optimized out>
        state = <value optimized out>
        endstate = <value optimized out>
        endpoint_interface = <value optimized out>
        driver_state_handler = 0xcb8420
        application_state_handler = <value optimized out>
        new_loops = 60000
        __PRETTY_FUNCTION__ = "switch_core_session_run"
        __func__ = "switch_core_session_run"
#2  0x009275ca in switch_core_session_thread (thread=0x823fdd8,
obj=0x81bc238)
    at src/switch_core_session.c:1309
        session = 0x81bc238
        event = <value optimized out>
        event_str = 0x0
        val = <value optimized out>
        __func__ = "switch_core_session_thread"
        __PRETTY_FUNCTION__ = "switch_core_session_thread"
#3  0x009c2d16 in dummy_worker (opaque=0x823fdd8) at
threadproc/unix/thread.c:138
---Type <return> to continue, or q <return> to quit---
No locals.
#4  0x002af832 in start_thread () from /lib/libpthread.so.0
No symbol table info available.
#5  0x0078145e in clone () from /lib/libc.so.6
No symbol table info available.
(gdb)

2011/10/24 Stephen Wilde <wstephen80 at gmail.com>

> 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
>>
>>
>
>
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20111025/b91d527b/attachment-0001.html 


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