
Ich habe die ALSA-Beispielquellcodes heruntergeladen (https://gist.github.com/ghedo/963382) und beim Testen unter einem Putty-Fenster funktioniert es. Wenn es jedoch mit oder ohne „sudo“ in das Startskript (z. B. rc.local) eingefügt wurde, stürzte es ab.
Hinweis: Die Anwendung stürzt nur nach dem automatischen Ausführen beim Einschalten ab. Wenn Sie das Skript in Putty (Befehlszeile) ausführen, besteht kein Problem.
Nachdem vor jedem Aufruf der snd_xxx-Funktion eine Protokollierung hinzugefügt wurde, wurde festgestellt, dass die Anwendung nach dem Aufruf von snd_pcm_hw_params_any gestoppt wird, was bedeutet, dass sie nach snd_pcm_open und snd_pcm_hw_params_alloca abstürzt. Der folgende Code lautet:
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_open"); /////logged
if ((pcm = snd_pcm_open(&pcm_handle, acDev, /////PCM_DEVICE, acDev="default:0"
SND_PCM_STREAM_PLAYBACK, 0)) < 0)
{
sprintf(acLog, "[audio]Can't open \"%s\" PCM device. %s\n", acDev, snd_strerror(pcm));
g_pLog->LogInfo(LOG_SYS, acLog);
return -1;
}
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_hw_params_alloca"); /////logged
/* Allocate parameters object and fill it with default values*/
snd_pcm_hw_params_alloca(¶ms);
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_hw_params_any"); /////logged and is the last line
snd_pcm_hw_params_any(pcm_handle, params);
g_pLog->LogInfo(LOG_SYS, "[audio]snd_pcm_hw_params_set_access");
/* Set parameters */
if (pcm = snd_pcm_hw_params_set_access(pcm_handle, params,
SND_PCM_ACCESS_RW_INTERLEAVED) < 0)
...
Nachdem Sie die Core-Dump-Datei gesammelt und mit gdb „bt full“ geprüft haben, lautet das Ergebnis:
root@linaro-ubuntu-desktop:/test# gdb ./AudioPlayer /opt/core.AudioPlayer.6277.1604311455.6
GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-linux-gnueabi".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /test/AudioPlayer...(no debugging symbols found)...done.
[New LWP 6277]
[Thread debugging using libthread_db enabled]
Core was generated by `/test/AudioPlayer'.
Program terminated with signal 6, Aborted.
#0 0x2ad8bed6 in ?? () from /lib/arm-linux-gnueabi/libc.so.6
(gdb) bt full
#0 0x2ad8bed6 in ?? () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#1 0x2ad9a0da in raise () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#2 0x2ad9c506 in abort () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#3 0x2ad951ec in __assert_fail () from /lib/arm-linux-gnueabi/libc.so.6
No symbol table info available.
#4 0x2ac6cb72 in snd_pcm_hw_refine () from /usr/lib/arm-linux-gnueabi/libasound.so.2
No symbol table info available.
#5 0x0000aca8 in main ()
No symbol table info available.
Beachten Sie, dass „snd_pcm_hw_refine“ nicht direkt von der Anwendung aufgerufen wird.
Ich frage mich, was der Unterschied zwischen der Ausführung in Putty und der Ausführung über ein Startskript beim Einschalten ist und wie dieser Fehler behoben werden kann. Ich wäre dankbar, wenn Sie mir einen Rat geben könnten ...