系统默认安装的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
安装时注意先alsa-lib,后alsa-utils
解压后进入目录,然后执行
$ 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
暂时到这一步。
编译过程同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
至此,所需的全部文件都已经准备好,下一步就是将文件移植到对应位置上。
安装到本机
直接拷贝
拷贝依赖库
$ 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
说明文件拷贝的路径有问题,根据提示,将相应的文件(夹)拷贝到指定目录即可。
如果前面的./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本身的方法不再叙述