我正在尝试在下一个代码中将 gdb 与 alsa-lib 一起使用,我使用 gdb 来查看指针结构,但我发现了这个 <incomplete type>
什么时候使用gdb
我将 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 行打断(在返回 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 中可以使用 gdb,所以不要出现这个声明。
我在其他帖子中读到,如果添加 #include <sound/asound.h>
问题就解决了但我发现双重声明的相同错误,我认为我解决了代码库 pcm_local.h 中双重声明注释部分的错误,但我不知道这是否是一个好的解决方案,任何人都可以帮助我,我需要什么知道使用 gdb whith alsa 吗?我在谷歌 (Googlear) 中搜索了任何解决方案,但我没有找到任何解决方案。
最佳答案
您的程序不包含 pcm_local.h
。您正在使用的指针旨在用作不透明指针。供应用程序使用的包含文件只有一个前向声明。您的应用程序应该将其视为句柄,类似于 FILE *
。
您可能真的不想知道它指向什么。如果你这样做,你必须确保你的 alsa 库编译时附加了调试信息(而不是剥离),并且你必须足够深入地进入 alsa 库函数,直到你到达确实 包含 pcm_local.h
。
是的,有一些方法可以包含结构定义并让 gdb 为您取消引用指针。但那是疯狂的方式。欺骗调试器做某事是伪装自己的好方法。
如果您真正感兴趣的是 alsa 句柄状态的某些方面,请查找报告其状态的函数。
关于c - 将 gdb 与 alsa-lib-1.1.3 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42730380/