[gelöst] ALSA-Anfänger: Programmabsturz nach Funktionsaufruf



  • Hallo Gemeinde,

    ich versuche mich gerade ein wenig in ALSA-Programmierung einzuarbeiten und bin dabei auf ein komisches Problem gestoßen. Als ich Listing 2 von diesem Artikel nachprogrammiert habe (http://www.linuxjournal.com/article/6735?page=0,1), bin ich auf seltsames Problem gestoßen.

    So wie es ausschaut, stürzt das Programm beim nächsten Funktionsaufruf nach

    snd_pcm_hw_params_get_buffer_size()
    

    ab. Folgt nach dem Funktionsaufruf kein weiterer snd_pcm_param_-Aufruf funktioniert das Programm (und auch die Funktion) wie erwartet.
    Folgt auf snd_
    _get_buffer_size() aber ein weiterer Aufruf, stürzt das Programm an dieser Stelle mit einem SegFault ab.

    Ich habe mal den Code auf PasteBin geladen:
    http://pastebin.com/KVy558Uz

    Zum Rumprobieren habe ich zwei #defines eingebunden. Sind beide gesetzt stürzt das Programm ab, sonst nicht.

    Übersetzt habe ich das Programm mit:
    - gcc-Version 6.3.1 20170109
    - Advanced Linux Sound Architecture Driver Version k4.8.13-1-ARCH

    Ich habe erst neulich nach längerer Abstinenz das Programmieren wieder angefangen, daher könnte das ganze auch an einem saublöden Anfängerfehler liegen 😉



  • Warum übergibst du denn an diese Funktion einen Zeiger auf einen "unsigned int"? Der Cast auf "snd_pcm_uframes_t" übergeht nur den Compiler, aber zur Laufzeit wird dann halt in nicht (korrekt) reservierten Speicher geschrieben.

    Wäre nicht

    snd_pcm_hw_params_get_buffer_size(params, &frames);
    

    sinnvoller?



  • Moin! Vielen Dank für die schnelle Antwort, Th69 🙂

    Th69 schrieb:

    Warum übergibst du denn an diese Funktion einen Zeiger auf einen "unsigned int"? Der Cast auf "snd_pcm_uframes_t" übergeht nur den Compiler, aber zur Laufzeit wird dann halt in nicht (korrekt) reservierten Speicher geschrieben.

    Ja, gute Frage! Im Prinzip habe ich das so gemacht, weil es in dem verlinkten ALSA-Artikel so stand und etwas ähnliches auch (unfallfrei) an anderer Stelle zelebriert wird, z.B.

    snd_pcm_hw_params_get_access(params,
                              (snd_pcm_access_t *) &val);
    

    Daher bin ich davon ausgegangen, dass es wohl ein verkappter void*-Cast ist. Der etwas verwegene Umgang mit Zeiger im Original-Listing ist mir aber auch schon beim Abtippen aufgefallen.

    Das lustige ist jetzt aber:

    Wäre nicht

    snd_pcm_hw_params_get_buffer_size(params, &frames);
    

    sinnvoller?

    ..dass du vollkommen Recht hast. Kompiliere ich das Programm mit '&frames' an diese Stelle, funktioniert alles wunderbar. Jetzt muss ich mich nur noch ein bisschen am Kopf kratzen und fragen, warum sich das Programm an dieser Stelle so verhält...

    Jedenfalls vielen Dank für deine Hilfe! 🙂


Anmelden zum Antworten