ALSA的重装、移植及GDB调试

1、源码下载

系统默认安装的alsa不具备调试能力,因此需要重装。

获取alsa-utils及alsa-lib源码包,下载链接如下:

http://www.alsa-project.org/main/index.php/Download

本次操作使用目前最新的1.1.6版。

alsa-lib-1.1.6.tar.bz2  ,  alsa-utils-1.1.6.tar.bz2

 

2、编译安装

安装时注意先alsa-lib,后alsa-utils

2.1 编译alsa-lib

 解压后进入目录,然后执行

$ cd alsa-lib-1.1.6/
$ ./configure  --host=x86_64-linux  --prefix=/usr/share/anyname/

这里的host选择的是x86_64,如果需要移植到arm下,对应修改即可;--prefix指定了安装目录,只是临时目录。

查看生成的Makefile文件,确认CFLAGS是否设置,默认是设置的,如下。

CFLAGS = -g -O2

然后执行:

$ make 
$ make install

暂时到这一步。

2.2 编译alsa-utils

 编译过程同alsa-lib,解压后进入目录,然后执行

$ cd alsa-utils-1.1.6/
$ ./configure  --host=x86_64-linux  \
  --prefix=/usr/share/anyname/ \
  --with-alsa-inc-prefix=/usr/share/anyname/include/ \
  --with-alsa-prefix=/usr/share/anyname/lib/ \
  --disable-alsamixer --disable-xmlto
$ make 
$ make install

如果编译期间报缺少lfftw3错,则安装之后再次编译即可。

$ sudo apt-get install libfftw3-dev

至此,所需的全部文件都已经准备好,下一步就是将文件移植到对应位置上。

2.3 安装

安装到本机

直接拷贝

拷贝依赖库
$ cp /use/share/anyname/lib/libasound.so.2.0.0 /usr/lib/x86_64-linux-gnu/libasound.so.2.0.0

拷贝 aplay, arecord, amixer ...
$ cp /usr/share/anyname/bin/* /usr/bin/

注意,libasound.so.2.0.0在本机的目标位置是利用 #ldd /usr/bin/aplay 命令查看到的

移植到其它目标板

如果需要安装到其它板子上,还需要将

a.编译生成的其它文件一并拷贝到目标系统

将目标板上的Linux System的根目录称为$rootfs,则:
$ cp –rfa  /usr/share/anyname/lib/*  $rootfs/lib/
$ cp –rfa  /usr/share/anyname/bin/*  $rootfs/sbin/
$ cp –rfa  /usr/share/anyname/sbin/*  $rootfs/sbin/

b.确认系统中有必须的依赖库,如果没有,也需一并拷贝。下列的文件可能是软连接,注意源拷贝。

$ ldd /usr/share/anyname/bin/aplay
	linux-vdso.so.1 =>  (0x00007fffccdfe000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f848012d000)
	libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007f847fe3d000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f847fc1f000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f847f855000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f847f54f000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f847f34b000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f848034f000)
$

至此,已经完成了alsa-utils,alsa-lib的替换/移植。

如果使用时出现类似如下错误:

ALSA lib conf.c:3601:(snd_config_update_r) Cannot access file /usr/local/alsa/share/alsa/alsa.conf

说明文件拷贝的路径有问题,根据提示,将相应的文件(夹)拷贝到指定目录即可。

3、GDB调试

如果前面的./configure阶段之后生成的Makefile中的CFLAGS均设置了,接下来就可以直接进入调试。中文部分为注释

$ ls 
demo.wav
$ 
$ gdb /usr/bin/aplay

添加断点1,位于aplay.c的main函数入口
(gdb) b aplay.c : main 
Breakpoint 1 at 0x409780: file aplay.c, line 470.

添加断点2,由于该位置位于依赖库中,所以pending on future
(gdb) b pcm_mmap.c : snd_pcm_mmap_writei
No source file named pcm_mmap.c.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 2 (pcm_mmap.c : snd_pcm_mmap_writei) pending.

查看断点
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000409780 in main at aplay.c:470
2       breakpoint     keep y             pcm_mmap.c : snd_pcm_mmap_writei

执行
(gdb) r demo.wav
Starting program: /usr/bin/aplay demo.wav
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

在断点1处停止
Breakpoint 1, main (argc=2, argv=0x7fffffffe518) at aplay.c:470
470	{

继续执行
(gdb) c
Continuing.
Playing WAVE 'demo.wav' : Signed 16 bit Little Endian, Rate 32000 Hz, Stereo

在断点2处停止
Breakpoint 2, snd_pcm_mmap_writei (pcm=0x624cc0, buffer=0x66d750, size=682) at pcm_mmap.c:150
150	{

删除断点2
(gdb) d 2

继续执行
(gdb) c
Continuing.

更多GDB本身的方法不再叙述

你可能感兴趣的:(alsa,alsa,gdb,移植)