调用sp_session_create后,libspotify与segFault崩溃
我正在测试libspotify库(linux版本为12.1.51 x86),当我调用sp_session_create()时,应用程序不断崩溃,出现分段错误 我没有应用程序密钥,也没有高级Spotify帐户(目前),但这不应该是崩溃的原因,因为如果我没记错的话,有一个无效应用程序密钥的错误代码 我的代码如下:调用sp_session_create后,libspotify与segFault崩溃,c,spotify,libspotify,C,Spotify,Libspotify,我正在测试libspotify库(linux版本为12.1.51 x86),当我调用sp_session_create()时,应用程序不断崩溃,出现分段错误 我没有应用程序密钥,也没有高级Spotify帐户(目前),但这不应该是崩溃的原因,因为如果我没记错的话,有一个无效应用程序密钥的错误代码 我的代码如下: static uint_8_t g_appkey[] = {1, 2, 3}; static const char *username = "MyUsername"; static con
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);
}
有没有关于问题出在哪里的提示
感谢您的帮助
来自gdb的回溯跟踪:
[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 sem_wait@@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)
存储类为static的变量不需要为空,默认情况下为空
/* struct fill */
memset(&session_callbacks, 0, sizeof(session_callbacks));
memset(&spconfig, 0, sizeof(spconfig));
确保这些文件夹确实存在 编辑:实际上
缓存位置应该由库创建
spconfig.cache_location = "tmp";
spconfig.settings_location = "tmp";
有关完整示例,请参见:
存储类为静态的变量不需要为空,默认情况下为空
/* struct fill */
memset(&session_callbacks, 0, sizeof(session_callbacks));
memset(&spconfig, 0, sizeof(spconfig));
确保这些文件夹确实存在
编辑:实际上缓存位置应该由库创建
spconfig.cache_location = "tmp";
spconfig.settings_location = "tmp";
有关完整示例,请参见:
你的假应用程序密钥很短。查看一个有效的应用程序密钥,它有321字节长,前两个字节是big-endian数字322。我猜,也许前两个字节告诉libspotify它需要分配多大的以null结尾的字符串来存储整个密钥。如果libspotify信任的不是应用程序的密钥大小,而是应用程序的密钥大小,这可能就是为什么它会崩溃而不是返回错误。您的伪应用程序密钥非常短。查看一个有效的应用程序密钥,它有321字节长,前两个字节是big-endian数字322。我猜,也许前两个字节告诉libspotify它需要分配多大的以null结尾的字符串来存储整个密钥。如果libspotify信任的不是应用程序的大小,而是应用程序的大小,这可能就是它崩溃而不是返回错误的原因。我利用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附带的示例代码,特别是自动存储塔
示例。在上面的shell示例中,我刚刚用您的代码替换了jukebox.c
,并让它顺利构建
这里可能有一些bug在libspotify的更高版本中得到了修复(免责声明:我为Spotify工作,并实际使用最新的12.x代码编译了上述示例,其中可能包含一些未发布的bug修复)。但是,代码本身似乎没有做任何异常的事情,但是,如果您遇到问题,我建议您根据您的目的调整jukebox.c
。我使用此代码并根据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附带的示例代码,特别是自动存储塔
示例。在上面的shell示例中,我刚刚用您的代码替换了jukebox.c
,并让它顺利构建
这里可能有一些bug在libspotify的更高版本中得到了修复(免责声明:我为Spotify工作,并实际使用最新的12.x代码编译了上述示例,其中可能包含一些未发布的bug修复)。然而,代码本身似乎没有做任何不寻常的事情,但是,如果您遇到问题,我建议您根据您的目的调整jukebox.c
。问题解决了
我从spotify获得了一个有效的应用程序密钥,测试了我的代码,现在它可以工作了
当前LiveLibspotify版本在输入无效的应用程序密钥时似乎存在错误。问题已解决
我从spotify获得了一个有效的应用程序密钥,测试了我的代码,现在它可以工作了
当前LiveLibspotify版本在输入无效的应用程序密钥时似乎存在错误。请提供gdb backtrace/stacktrace-使用gdb。即使您没有有效的用户/passwd登录,它也不会崩溃,但会返回一个指示登录失败的有效值。请提供gdb backtrace/stacktrace-使用gdb。即使您没有有效的user/passwd登录,它也不会崩溃,但会返回一个有效值,指示登录失败。从文件夹开始,它就存在。请尝试其他文件夹名称并检查它是否已创建,为执行用户为其父目录断言
wr
权限。所有已选中,仍然相同。即使放了x权限,仍然不起作用。已经重新下载了libspotify.dll,还是原来的。应该是libspotify.so
,*.dll
是windows Foo我的错,我是说。所以,我查阅了那个网站。从文件夹开始,它就存在。请尝试其他文件夹名称并检查它是否已创建,为执行用户为其父目录断言wr
权限。所有已选中,仍然相同。即使放了x权限,仍然不起作用。已经重新下载了libspotify.dll,但还是一样。它应该是libspotify.so
,*.dll
是windows Foo我的错,我是说。所以,我尝试运行自动存储塔示例,但它一直崩溃。甚至在另一台linux机器上进行了测试,结果也是一样的。我所做的唯一更改是在appkey.c文件中使用我的假应用程序密钥。我试图运行自动存储塔示例,但它一直崩溃。甚至在另一台linux机器上进行了测试,结果也是一样的。我所做的唯一更改是在appkey.c文件中使用我的假应用程序密钥。尝试过了,同样的错误。使其类似于uint16_t*ptr=&g_appkey[0]*ptr=htobe16(322)
并更改了数组的大小。尝试了该操作,出现了相同的错误。使其类似于uint16_t*ptr=&g_appkey[0]*ptr=htobe16(322)代码>并更改了的大小