[Freeswitch-dev] Module segfault
Juan Antonio Ibañez Santorum
juanito1982 at gmail.com
Sat May 28 20:10:21 MSD 2016
Hello,
I built one module similar to mod_niblebill for billing puroses. It
works ok but sometimes I get a segfault and I don't understand why. The
code I use in my application for generating outgoing session is:
------------------------------
status = switch_ivr_originate(session, &peer_session, &cause,
cadena_marcado_tmp, 0, NULL, rt->callerid_name, rt->callerid_number, NULL,
NULL, SOF_NONE, NULL);
if(status == SWITCH_STATUS_SUCCESS){
if (switch_channel_test_flag(caller_channel, CF_PROXY_MODE)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "%s: Llamada
switch_ivr_signal_bridge\n", rt->uuid);
switch_ivr_signal_bridge(session, peer_session);
} else {
switch_channel_t *channel = switch_core_session_get_channel(session);
switch_channel_t *peer_channel =
switch_core_session_get_channel(peer_session);
char *a_key = (char *) switch_channel_get_variable(channel,
"bridge_terminate_key");
char *b_key = (char *) switch_channel_get_variable(peer_channel,
"bridge_terminate_key");
int ok = 0;
//switch_input_callback_function_t func = NULL;
rt->peer_channel = peer_channel;
rt->peer_profile = switch_channel_get_caller_profile(peer_channel);
if (a_key) {
a_key = switch_core_session_strdup(session, a_key);
ok++;
}
if (b_key) {
b_key = switch_core_session_strdup(session, b_key);
ok++;
}
if (switch_true(switch_channel_get_variable(caller_channel,
SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE)) ||
switch_true(switch_channel_get_variable(peer_channel,
SWITCH_BYPASS_MEDIA_AFTER_BRIDGE_VARIABLE))) {
switch_channel_set_flag(caller_channel, CF_BYPASS_MEDIA_AFTER_BRIDGE);
}
switch_core_session_enable_heartbeat(session, rt->heartbeat_interval);
// Bridge
switch_ivr_multi_threaded_bridge(session, peer_session, NULL, NULL, NULL);
if(peer_channel){
if((peer_profile = switch_channel_get_caller_profile(peer_channel))){
}
rt->codec_out = switch_core_strdup(pool,
switch_channel_get_variable(peer_channel, "write_codec"));
}
switch_core_session_disable_heartbeat(session);
}
}
------------------------------
At the end of the application function y use this code to do some tasks if
the call gets answered:
------------------------------
...
if(dc->rt->peer_channel && switch_channel_test_flag(dc->rt->peer_channel,
CF_ANSWERED)){
// Tasks if answered
}
...
------------------------------
I don't understand why sometimes switch_channel_test_flag generate a
segfault. GDB stack trace is:
------------------------------
#0 0x00007f2947415420 in pthread_mutex_lock () from /lib64/libpthread.so.0
#1 0x00007f2948e522f3 in switch_channel_test_flag (channel=0x7f2934558a30,
flag=CF_ANSWERED) at src/switch_channel.c:1539
#2 0x00007f292950dcf6 in procesar_hangup (session=0x7f293826b998)
at
/usr/src/instalacion/09freeswitch/freeswitch-1.4.23/src/mod/applications/mod_svbilling/mod_svbilling.c:4743
#3 0x00007f29295153a8 in do_routing (session=0x7f293826b998)
at
/usr/src/instalacion/09freeswitch/freeswitch-1.4.23/src/mod/applications/mod_svbilling/mod_svbilling.c:3937
#4 0x00007f2948e7d4d0 in switch_core_session_exec (session=0x7f293826b998,
application_interface=0xd73208, arg=0x7f293429d550 "process")
at src/switch_core_session.c:2754
#5 0x00007f2948e7da32 in switch_core_session_execute_application_get_flags
(
session=0x7f293826b998, app=0x7f293429d540 "svbillingapp",
arg=0x7f293429d550 "process", flags=<value optimized out>)
at src/switch_core_session.c:2624
#6 0x00007f2948e81794 in switch_core_standard_on_execute (
session=0x7f293826b998) at src/switch_core_state_machine.c:283
#7 switch_core_session_run (session=0x7f293826b998)
at src/switch_core_state_machine.c:535
#8 0x00007f2948e7c23e in switch_core_session_thread (
thread=<value optimized out>, obj=0x7f293826b998)
at src/switch_core_session.c:1607
...
------------------------------
The generated core can be downloaded at:
https://dl.dropboxusercontent.com/u/45510863/coretx/core.zip
and the line generating the segfault inside switch_channel.c is
------------------------------
switch_mutex_lock(channel->flag_mutex);
------------------------------
I suppose I am doing something in a wrong way but I don't know which one.
Do anyone knows why?
Regards
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-dev/attachments/20160528/b8451475/attachment.html
Join us at ClueCon 2016 Aug 8-12, 2016
More information about the FreeSWITCH-dev
mailing list