将 gdb 与 alsa-lib-1.1.3 一起使用

Use gdb with alsa-lib-1.1.3

我正在尝试在下一个代码中将 gdb 与 alsa-lib 一起使用,我使用 gdb 来查看指针结构,但是我在使用 gdb

时发现了这个 <incomplete type>

我将 gcc 用于编译器,并放置了一个标志 -lasound

 gcc ejemplo.c   -lasound  -g  -o ejemplo  

+

    #include <alsa/asoundlib.h>
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    //#include"pcm_local.h"
    //#include <sound/asound.h>

    int main()
    { 
      snd_pcm_t *handle_capture;
      snd_pcm_open(&handle_capture,"default", SND_PCM_STREAM_PLAYBACK, SND_PCM_ASYNC);
       return 0;
    }

我在第 15 行(在 return 0 之前)打了一个断点,看看这个

(gdb) break 15
(gdb) p *handle_capture
<incomplete type>

我看到 pcm.h 第 327 行的声明

typedef struct _snd_pcm snd_pcm_t

并搜索 _snd_pcm,我在 "pcm_local.h" 第 179 行

中找到声明
 struct _snd_pcm {

我添加了库,但出现错误或双重声明。

我也看到了 libasound.so

的声明
nm -D /usr/lib/x86_64-linux-gnu/libasound.so

但我没有找到声明(_snd_pcm 或 snd_pcm_t), 并且看到我不知道如果 libasond.so 中没有出现此声明,则可以使用 gdb。

我在其他 post 中读到,如果添加 #include <sound/asound.h> 问题就解决了,但我发现双重声明的相同错误,我认为我解决了库中双重声明注释部分的错误 pcm_local.h 的代码,但我不知道它是否是一个好的解决方案,任何可以帮助我,我需要知道什么才能使用 gdb whith alsa?,我在 google (Googlear) 中搜索了任何解决方案但是我没有找到任何解决方案。

您的程序不包含 pcm_local.h。您正在使用的指针旨在用作不透明指针。供应用程序使用的包含文件只有一个前向声明。您的应用程序应该将其视为句柄,类似于 FILE *

你可能真的不想知道它指向什么。如果你这样做,你必须确保你的 alsa 库编译时附加了调试信息(没有去除),并且你必须足够深入地进入 alsa 库函数,直到你到达 执行的代码 包括 pcm_local.h

是的,有一些方法可以包含结构定义并让 gdb 为您取消引用指针。但那是疯狂的方式。欺骗调试器做某事是伪装自己的好方法。

如果您真正感兴趣的是 alsa 句柄状态的某些方面,请查找报告其状态的函数。