У меня неожиданное поведение в собственной функции C, которая вызывается потоком AsyncTask.Код довольно прост.Я делаю проверку ошибок памяти, в которую я собираюсь скопировать строку.Набор сообщений отправляется на отладку.Тем не менее, несмотря на все проверки, которые я выполняю для переменной, я все равно получаю segfault в strncpy ().Кроме того, сообщения отладки пропускаются, как если бы задача была прервана и не возобновлена в этом месте.
// First, allocate memory to copy in a string, ensure pointer not NULL
char *str_res = malloc(1024);
if(str_res==NULL)
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "error allocating memory for return string, doh");
memset(str_res, '\0', sizeof(str_res));
// Do incremental checks that the source string is valid
if(dissection == NULL)
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d]: dissection is null when trying to copy string", _pkt_count);
else if(dissection->fields == NULL)
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d]: dissection->fields is null when trying to copy string", _pkt_count);
else if(dissection->fields->field_values == NULL)
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d]: dissection->fields->field_values is null when trying to copy string", _pkt_count);
else if(dissection->fields->field_values[0] == NULL)
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d]: dissection->fields->field_values[0] is null when trying to copy string", _pkt_count);
else
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d]: should be trying to copy string", _pkt_count);
// Do one last check, then strncpy if the source string is not null
if(dissection->fields->field_values[0]!=NULL) {
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d]: trying to copy string...", _pkt_count);
strncpy(str_res, dissection->fields->field_values[0]->str, 1023);
} else {
__android_log_print(ANDROID_LOG_INFO, LOG_TAG, "[%d]: not copying, bailing", _pkt_count);
myoutput_fields_free(dissection->fields);
free(str_res);
return NULL;
}
Несмотря на все эти проверки, я получаю ошибку segfault на strncpy, которую пытаюсь отладить:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 4282]
0x80d03b74 in wiresharkGet (wfd_ptr=8425344, field=0x80a128 "wlan_mgt.fixed.beacon") at /Users/gnychis/Documents/workspace/CoexiSyst/jni/libwireshark/wireshark_helper.c:686
686 strncpy(str_res, dissection->fields->field_values[0]->str, 1023);
Во-первых, malloc всегда завершается успешно и никогда не возвращает NULL.Вот странная часть, это вывод отладки:
INFO/WiresharkDriver(4171): [289]: dissection->fields->field_values[0] is null when trying to copy string
DEBUG/WiFiScanReceiver(4171): Received incoming scan complete message
INFO/WiresharkDriver(4171): [290]: should be trying to copy string
INFO/WiresharkDriver(4171): [290]: trying to copy string...
INFO/WiresharkDriver(4171): [291]: should be trying to copy string
INFO/WiresharkDriver(4171): [291]: trying to copy string...
INFO/WiresharkDriver(4171): [292]: should be trying to copy string
INFO/WiresharkDriver(4171): [292]: trying to copy string...
INFO/WiresharkDriver(4171): [293]: should be trying to copy string
INFO/WiresharkDriver(4171): [293]: trying to copy string...
INFO/WiresharkDriver(4171): [294]: should be trying to copy string
INFO/WiresharkDriver(4171): [294]: trying to copy string...
INFO/WiresharkDriver(4171): [294]: trying to copy string...
Первое, что следует отметить, это число в скобках, например, "[#]: should ..." Это числономер пакета, и для каждого номера пакета должно быть напечатано одно из инкрементных проверочных сообщений, а затем одно из полученных сообщений: «попытка скопировать строку» или «не копировать, отправка».
Однако, как выИз результатов отладки видно, что первое сообщение «INFO / WiresharkDriver (4171): [289]: disction-> fields-> field_values [0] равно null при попытке скопировать строку», но с ним не связано никакого последующего сообщенияс этим пакетом.Как это может быть?Может ли AsyncTask быть прервана, а затем продолжить выполнение в другом месте?