将 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 句柄状态的某些方面,请查找报告其状态的函数。
我正在尝试在下一个代码中将 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 句柄状态的某些方面,请查找报告其状态的函数。