2013-08-28 3 views
1

Я тестировал библиотеку libspotify (версия 12.1.51 x86 для linux), и приложение продолжает сбой при вызове sp_session_create() с ошибкой сегментации.Сбой libspotify с segFault после вызова sp_session_create

У меня нет ключа приложения или учетной записи Premium Spotify (пока), но это не должно быть причиной сбоя, так как если я правильно помню, есть код ошибки для недействительного ключа приложения.

Мой код выглядит следующим образом:

static uint_8_t g_appkey[] = {1, 2, 3}; 
static const char *username = "MyUsername"; 
static const char *password = "MyPassword"; 
static int logged_in; 

static sp_session_callbacks session_callbacks; 
static sp_session_config spconfig; 

static void on_login(sp_session *session, sp_error error) { 
    printf("Callback: on_login"); 
    if (error != SP_ERROR_OK) { 
     printf("Error: Unable to login: %d\n", (int) error); 
     exit(-1); 
    } 
    logged_in = 1; 
} 

static void on_main_thread_notified(sp_session *session) { 
    printf("callback: on_main_thread_notified"); 
} 

static void on_log_message(sp_session *session, const char *data) { 
    printf("callback: on_log_message"); 
} 

int main(int argc, char **argv) { 
    sp_error error; 
    sp_session *session; 
    int next_timeout; 

    /* struct fill */ 
    memset(&session_callbacks, 0, sizeof(session_callbacks)); 
    memset(&spconfig, 0, sizeof(spconfig)); 

    session_callbacks.logged_in   = &on_login; 
    session_callbacks.notify_main_thread = &on_main_thread_notified; 
    session_callbacks.log_message  = &on_log_message; 

    spconfig.api_version   = SPOTIFY_API_VERSION; 
    spconfig.cache_location  = "tmp"; 
    spconfig.settings_location = "tmp"; 
    spconfig.application_key  = g_appkey; 
    spconfig.application_key_size = sizeof(g_appkey); 
    spconfig.user_agent   = "spot"; 
    spconfig.callbacks   = &session_callbacks; 

    /* session creation */ 
    error = sp_session_create(&spconfig, &session); 
    if (error != SP_ERROR_OK) { 
     printf("ERROR: Unable to create spotify session: %s\n", sp_error_message(error)); 
     exit(-1); 
    } 

    /* log in */ 
    logged_in = 0; 
    sp_session_login(session, username, password, 0, NULL); 
    while(!logged_in) { 
     sp_session_process_events(session, &next_timeout); 
     sleep(next_timeout); 
    } 

    printf("Sucess!!"); 
    exit(0); 
} 

Любые советы для которых может быть проблема?

Оценка за любую предоставленную помощь.


трассировку от БГД:

[Thread debugging using libthread_db enabled] 
[New Thread 0xb7fe6b70 (LWP 1839)] 
[New Thread 0xb7f65b70 (LWP 1840)] 

Program received signal SIGSEGV, Segmentation fault. 
0x002b9b36 in sp_session_create() from /usr/local/lib/libspotify.so.12 
(gdb) thread apply all backtrace 

Thread 3 (Thread 0xb7f65b70 (LWP 1840)): 
#0 0x0012d422 in __kernel_vsyscall() 
#1 0x003e6ce6 in nanosleep() at ../sysdeps/unix/syscall-template.S:82 
#2 0x0041644c in usleep (useconds=10000) at ../sysdeps/unix/sysv/linux/usleep.c:33 
#3 0x00293581 in ??() from /usr/local/lib/libspotify.so.12 
#4 0x00293990 in ??() from /usr/local/lib/libspotify.so.12 
#5 0x001d42b7 in ??() from /usr/local/lib/libspotify.so.12 
#6 0x004ae96e in start_thread (arg=0xb7f65b70) at pthread_create.c:300 
#7 0x0041ca4e in clone() at ../sysdeps/unix/sysv/linux/i386/clone.S:130 

Thread 2 (Thread 0xb7fe6b70 (LWP 1839)): 
#0 0x0012d422 in __kernel_vsyscall() 
#1 0x004b5245 in [email protected]@GLIBC_2.1() at ../nptl/sysdeps/unix/sysv/linux/i386/i686/../i486/sem_wait.S:80 
#2 0x002178fa in ??() from /usr/local/lib/libspotify.so.12 
#3 0x001d42b7 in ??() from /usr/local/lib/libspotify.so.12 
#4 0x004ae96e in start_thread (arg=0xb7fe6b70) at pthread_create.c:300 
#5 0x0041ca4e in clone() at ../sysdeps/unix/sysv/linux/i386/clone.S:130 

Thread 1 (Thread 0xb7fe78d0 (LWP 1836)): 
#0 0x002b9b36 in sp_session_create() from /usr/local/lib/libspotify.so.12 
#1 0x080487d5 in main() 
(gdb) 
+0

Просьба указать gdb backtrace/stacktrace - использовать gdb. Даже если у вас нет допустимого пользователя/пароля для входа в систему, он не должен терпеть крах, а возвращает действительное значение, указывающее на неспособность войти в систему. – drahnr

ответ

1

Проблема решена.

У меня есть действительный ключ приложения от spotify, проверен мой код и теперь он работает.

Похоже, что текущая версия live libspotify имеет ошибку при вводе неверных ключей приложения.

0

переменных с классом static хранения не должны быть аннулированы, они по умолчанию

/* struct fill */ 
memset(&session_callbacks, 0, sizeof(session_callbacks)); 
memset(&spconfig, 0, sizeof(spconfig)); 

Убедитесь, что эти папки действительно существуют

EDIT: Фактически cache_location должен быть создан lib.

spconfig.cache_location  = "tmp"; 
spconfig.settings_location = "tmp"; 

Для полного примера см:

http://damienradtke.org/playing-with-the-spotify-api/

+0

Я проконсультировался с этим сайтом. Что касается папки, она существует. – TiagoOliveira

+0

Попробуйте ввести другое имя папки и проверьте, создано ли оно, утвердите разрешение 'wr 'для пользователя выполнения для его родительского каталога. – drahnr

+0

Все проверено, все равно. Даже положите разрешение x и все еще не работайте. Уже повторно загружен libspotify.dll и все тот же. – TiagoOliveira

0

Вашего поддельное приложение-ключ является очень коротким. Глядя на действительный ключ приложения, он имеет длину 321 байт, а первые два байта - это номер 323 большого числа. Я предполагаю, что, возможно, эти первые два байта говорят libspotify, как большая строка с нулевым завершением, которую нужно выделить для хранения весь ключ. Если libspotify доверяет, что вместо application_key_size это может быть причиной сбоя, а не для возврата ошибки.

+0

Пробовал это, ту же ошибку. Сделал что-то вроде 'uint16_t * ptr = & g_appkey [0]; * ptr = htobe16 (322); 'и изменил размер массива. – TiagoOliveira

0

Я взял этот код и построил его против libspotify-12, и получил его выполнить с ожидаемой ошибкой о приложении ID:

libspotify/examples/jukebox$ make 
cc -I/usr/include/alsa -I/home/nik/Code/spotify/libspotify/targets/Linux-x86_64-release/include -Wall -Wl,-rpath,/home/nik/Code/spotify/libspotify/targets/Linux-x86_64-release/lib -L/home/nik/Code/spotify/libspotify/targets/Linux-x86_64-release/lib jukebox.o appkey.o alsa-audio.o audio.o -o jukebox -lasound -lpthread -lspotify 
libspotify/examples/jukebox$ ./jukebox 
ERROR: Unable to create spotify session: Invalid application key 

Если у вас возникли проблемы при получении вещи и работает, я бы попробуйте взглянуть на пример кода, который поставляется с libspotify, в частности пример jukebox. В приведенном выше примере оболочки я просто заменил jukebox.c кодом и получил его без проблем.

Вполне возможно, что есть какая-то ошибка здесь, которая была исправлена ​​в более поздней версии libspotify (оговорке: Я работаю на Spotify и на самом деле составлен приведенный выше пример с последним кодом 12.x, который может содержать некоторые неизданные исправление ошибок). Однако сам код, похоже, не делает ничего необычного, но опять же, если у вас возникли проблемы, я бы предложил адаптировать jukebox.c к вашим целям.

+0

Я попытался запустить пример автомата, и он продолжает сбой. Даже протестирован в другой машине linux и в том же результате. Единственное изменение, которое я сделал, было в файле appkey.c с моим поддельным ключом приложения. – TiagoOliveira