dump线程backtrace方法总结

XXX(XXX:XXX) 09:11:02
请问那个MTK的那个RTT 怎么用啊?有终端命令吗
XXX(XXX-XXXXXX) 09:11:54
adb shell aee -m 3
adb shell rtt -f bt -p %sspid% > ssrtt.txt
adb shell rtt -f bt -p %sfpid% > sfrtt.txt
XXX(XXX-XXXXXX) 09:12:43
其实就两句话,adb shell aee -m 3,adb shell rtt -f bt -p pid
XXX(XXX-XXXXXX) 09:13:40
-m 3 是什么意思
XXX(XXX-XXXXXX) 09:13:54
mode
XXX(XXX-XXXXXX) 09:14:14
aee的几个调试模式吧
XXX(XXX-XXXXXX) 09:14:31
嗯。再问下
XXX(XXX-XXXXXX)09:14:32
-f bt 这是又是什么含义
XXX(XXX-XXXXXX) 09:16:07
感觉像是 -function  backtrace,猜的,具体我就不清楚了
XXX(XXX-XXXXXX) 09:16:33
有点像
XXX(XXX-XXXXXX) 09:16:44
你从哪里知道这些命令的啊
XXX(XXX-XXXXXX) 09:17:20
这个是沧沧的工具里的,沧沧工具里的东西应该是以前死机时MTK让这样抓的
XXX(XXX-XXXXXX) 09:18:12
沧沧工具 没见过,是什么东东
XXX(XXX-XXXXXX) 09:18:38
就是一键抓取log那个
XXX(XXX-XXXXXX) 09:18:47
测试员现在抓log都是用的那个玩意
XXX(XXX-XXXXXX) 09:19:26
是吴文仓写的那个抓Log的工具?

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

XXX(XXX-XXXXXX)09:39:58
kill -6 <pid>
Administrator@tgdn-3288 ~
$ adb shell kill -6 986
Administrator@tgdn-3288 ~
$ adb shell ls /data/tombstones

adb pull data/tombstones d:/tombstones

Administrator@tgdn-3288 ~
$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGEMT       8) SIGFPE       9) SIGKILL     10) SIGBUS
11) SIGSEGV     12) SIGSYS      13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGURG      17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGPWR      30) SIGUSR1
31) SIGUSR2     32) SIGRTMAX

手机获取root权限: adb vivoroot,并删除遗留的tombstones文件:adb shell rm /data/tombstones/tombstone*

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

命令名称:kill

使用权限:所有使用者
使用方式:
kill [-s sigspec | -n signum | -sigspec] pid | jobspec … or kill -l [sigspec]
说明:kill 送出一个特定的信号 (signal) 给行程 id 为 pid 的行程根据该信号而做特定的动作,若没有指定,预设是送出终止 (TERM) 的信号
-s (signal) : 其中常用的讯号有 HUP (1),KILL (9),TERM (15),分别代表着重跑,砍掉,结束; 详细的信号可以用 kill -l (见下结果,可用数字带入)
-p : 印出 pid,并不送出信号
-l (signal) : 列出所有可用的信号名称
这个就是kill -l的查询结果:
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
一般范例:
将 pid 为 323 的线程砍掉 (kill) :
kill -9 323
将 pid 为 456 的线程重跑 (restart) :
kill -HUP 456
一般来讲,查询PID的命令是
ps -ef | grep yum(表示查询的是yum的PID,根据查询的东西不同而异)。
举一个实际的例子:
比方说,fedora的在线更新命令yum锁锁住了,常见的提示是
Existing lock /var/run/yum.pid: another copy is running as pid 19698.
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
Another app is currently holding the yum lock; waiting for it to exit…
…….
这里就没必要使用ps命令了,因为已经知道PID就是19698这个值了,因此不用在查询。
这时就要使用kill将19698的进程杀死。其中的19698就是PID。
所以在命令行内输入:
kill -9 19698
就能成功的杀死这个进程。

编辑本段函数

kill(传送信号给指定的进程,使用 kill -l 命令可查看 linux系统中信号。)
相关函数 raise,signal
表头文件
#include<sys/types.h>
#include<signal.h>
定义函数 int kill(pid_t pid,int sig);
函数说明
kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:
pid>0 将信号传给进程识别码为pid 的进程。
pid=0 将信号传给和目前进程相同 进程组的所有进程
pid=-1 将信号广播传送给系统内所有的进程
pid<0 将信号传给 进程组识别码为pid 绝对值的所有进程
参数sig代表的信号:

 

Signal
Description
SIGABRT
由调用abort函数产生,进程非正常退出
SIGALRM
用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
SIGBUS
某种特定的硬件异常,通常由内存访问引起
SIGCANCEL
由Solaris Thread Library内部使用,通常不会使用
SIGCHLD
进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
SIGCONT
当被stop的进程恢复运行的时候,自动发送
SIGEMT
和实现相关的硬件异常
SIGFPE
数学相关的异常,如被0除,浮点溢出,等等
SIGFREEZE
Solaris专用,Hiberate或者Suspended时候发送
SIGHUP
发送给具有Terminal的Controlling Process,当terminal被disconnect时候发送
SIGILL
非法指令异常
SIGINFO
BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
SIGINT
由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
SIGIO
异步IO事件
SIGIOT
实现相关的硬件异常,一般对应SIGABRT
SIGKILL
无法处理和忽略。中止某个进程
SIGLWP
由Solaris Thread Libray内部使用
SIGPIPE
在reader中止之后写Pipe的时候发送
SIGPOLL
当某个事件发送给Pollable Device的时候发送
SIGPROF
Setitimer指定的Profiling Interval Timer所产生
SIGPWR
和系统相关。和UPS相关。
SIGQUIT
输入Quit Key的时候(CTRL+\)发送给所有Foreground Group的进程
SIGSEGV
非法内存访问
SIGSTKFLT
Linux专用,数学协处理器的栈异常
SIGSTOP
中止进程。无法处理和忽略。
SIGSYS
非法系统调用
SIGTERM
请求中止进程,kill命令缺省发送
SIGTHAW
Solaris专用,从Suspend恢复时候发送
SIGTRAP
实现相关的硬件异常。一般是调试异常
SIGTSTP
Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
SIGTTIN
当Background Group的进程尝试读取Terminal的时候发送
SIGTTOU
当Background Group的进程尝试写Terminal的时候发送
SIGURG
当out-of-band data接收的时候可能发送
SIGUSR1
用户自定义signal 1
SIGUSR2
用户自定义signal 2
SIGVTALRM
setitimer函数设置的Virtual Interval Timer超时的时候
SIGWAITING
Solaris Thread Library内部实现专用
SIGWINCH
当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
SIGXCPU
当CPU时间限制超时的时候
SIGXFSZ
进程超过文件大小限制
SIGXRES
Solaris专用,进程超过资源限制的时候发送

 

返回值 执行成功则返回0,如果有错误则返回-1。
EINVAL 参数sig 不合法
ESRCH 参数pid 所指定的进程或进程组不存在
EPERM 权限不够无法传送信号给指定进程
范例
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>
main()
{
pid_t pid;
int status;
if(!(pid= fork())){
printf(“Hi I am child process!\n”);
sleep(10);
return;
}
else{
printf(“send signal to child process (%d) \n”,pid);
sleep(1);
kill(pid,SIGABRT);
wait(&status);
if(WIFSIGNALED(status))
printf(“chile process receive signal %d\n”,WTERMSIG(status));
}
}
执行 sen signal to child process(3170)
Hi I am child process!
child process receive signal 6

 http://baike.baidu.com/view/22085.htm

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 
2009-07-16 13:10

Linux调用backtrack函数打印程序崩溃时的调用堆栈

可以给自己的程序都加上这个东西,便于快速的找到错误吧,看到别人都是这么用的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <signal.h>


//signal 函数用法参考http://www.kernel.org/doc/man-pages/online/pages/man2/signal.2.html
//backtrace ,backtrace_symbols函数用法参考 http://www.kernel.org/doc/man-pages/online/pages/man3/backtrace.3.html

static void WidebrightSegvHandler(int signum) {
    void *array[10];
    size_t size;
    char **strings;
    size_t i, j;

    signal(signum, SIG_DFL); /* 还原默认的信号处理handler */

    size = backtrace (array, 10);
    strings = (char **)backtrace_symbols (array, size);

    fprintf(stderr, "widebright received SIGSEGV! Stack trace:\n");
    for (i = 0; i < size; i++) {
        fprintf(stderr, "%d %s \n",i,strings[i]);
    }

    free (strings);
    exit(1);
}

int invalide_pointer_error(char * p)
{
    *p = 'd'; //让这里出现一个访问非法指针的错误
    return 0;
}


void error_2(char * p)
{
    invalide_pointer_error(p);
}

void error_1(char * p)
{
     error_2(p);
}

void error_0(char * p)
{
     error_1(p);
}





int main()
{

    //设置 信好的处理函数,各种 信号的定义见http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html
    signal(SIGSEGV, WidebrightSegvHandler); // SIGSEGV      11       Core    Invalid memory reference
    signal(SIGABRT, WidebrightSegvHandler); // SIGABRT       6       Core    Abort signal from


    char *a = NULL;
    error_0(a);
    exit(0);

}

widebright@widebright:~/桌面$ gcc main.c
widebright@widebright:~/桌面$ ./a.out
widebright received SIGSEGV! Stack trace:
0 ./a.out [0x8048580]
1 [0xb807a400]
2 ./a.out [0x8048636]
3 ./a.out [0x8048649]
4 ./a.out [0x804865c]
5 ./a.out [0x80486a9]
6 /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7f19775]

然后为了定位错误,我们需要加上-g参数重新编译一个带调试信息的版本
widebright@widebright:~/桌面$ gcc -g main.c
widebright@widebright:~/桌面$ ./a.out
widebright received SIGSEGV! Stack trace:
0 ./a.out [0x8048580]
1 [0xb7fb3400]
2 ./a.out [0x8048636]
3 ./a.out [0x8048649]
4 ./a.out [0x804865c]
5 ./a.out [0x80486a9]
6 /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7e52775]
7 ./a.out [0x80484c1]

加上-rdynamic 参数的话,输出的符号更清楚一些,不过好像地址不一样了。
widebright@widebright:~/桌面$ gcc -g -rdynamic main.c
widebright@widebright:~/桌面$ ./a.out
widebright received SIGSEGV! Stack trace:
0 ./a.out [0x8048840]
1 [0xb7f3d400]
2 ./a.out(error_2+0x11) [0x80488f6]
3 ./a.out(error_1+0x11) [0x8048909]
4 ./a.out(error_0+0x11) [0x804891c]
5 ./a.out(main+0x4b) [0x8048969]
6 /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5) [0xb7ddc775]
7 ./a.out [0x8048781]


可以看到有调试信息的时候,错误是一样的。然后就可以用gdb定位和调试错误了:
-----------------------
(gdb) info line *0x8048580
Line 19 of "main.c" starts at address 0x804856d <WidebrightSegvHandler+25>
   and ends at 0x8048583 <WidebrightSegvHandler+47>.
(gdb) list *0x8048580
0x8048580 is in WidebrightSegvHandler (main.c:19).
14        char **strings;
15        size_t i, j;
16   
17        signal(signum, SIG_DFL); /* 还原默认的信号处理handler */
18   
19        size = backtrace (array, 10);
20        strings = (char **)backtrace_symbols (array, size);
21   
22        fprintf(stderr, "widebright received SIGSEGV! Stack trace:\n");
23        for (i = 0; i < size; i++) {
-----------------
(gdb) list *0x8048636
0x8048636 is in error_2 (main.c:41).
36   
37   
38    void error_2(char * p)
39    {
40        invalide_pointer_error(p);
41    }
42   
43    void error_1(char * p)
44    {
45         error_2(p);
--------------
(gdb) list *0x8048649
0x8048649 is in error_1 (main.c:46).
41    }
42   
43    void error_1(char * p)
44    {
45         error_2(p);
46    }
47   
48    void error_0(char * p)
49    {
50         error_1(p);

=============
(gdb) br main.c:40
Breakpoint 1 at 0x804862b: file main.c, line 40.
(gdb) run
Starting program: /home/widebright/桌面/a.out

Breakpoint 1, error_2 (p=0x0) at main.c:40
40        invalide_pointer_error(p);
(gdb) stepi
0x0804862e    40        invalide_pointer_error(p);
(gdb) stepi
0x08048631    40        invalide_pointer_error(p);
(gdb) stepi
invalide_pointer_error (p=0x0) at main.c:32
32    {
(gdb) stepi
0x08048616    32    {
(gdb) stepi
33        *p = 'd'; //让这里出现一个访问非法指针的错误
(gdb) stepi
0x0804861b    33        *p = 'd'; //让这里出现一个访问非法指针的错误
(gdb) stepi

Program received signal SIGSEGV, Segmentation fault.
0x0804861b in invalide_pointer_error (p=0x0) at main.c:33
33        *p = 'd'; //让这里出现一个访问非法指针的错误

(gdb) print p
$1 = 0x0
(gdb) print *p
Cannot access memory at address 0x0




===============================================
好像使用   
    int sigaction(int signum, const struct sigaction *act,
                     struct sigaction *oldact);
http://www.kernel.org/doc/man-pages/online/pages/man2/sigaction.2.html
这个函数注册信号的处理函数的话,可以得到更多的信息,比如出错 时候的寄存器的值等等。
因为他函数 最后一个参数传过来一个ucontext_t *ucontext 的指针
可以看到 “善用backtrace解决大问题” http://blog.chinaunix.net/u/3425/showart_263408.html 这个网页上有给出一个例子。


最初看到这个用法的的在redhat的安装程序的anaconda里面的。


------------------------
关于backtrack的原理 的解释,参考这个:
从别人blog上拷来的,地址:http://blog.csdn.net/absurd/archive/2005/12/13/551585.aspx

开发嵌入式软件通常是比较麻烦的事,一些常用的工具往往无法使用,在开发PC软件时简单的任务,此时变得很复杂。今天就遇到了这样一件事,折腾了几个小时,仅仅是为知道call stack。

我编译了一个程序放到PDA(ARM9+LINUX+UCLIBC)上面运行,出现了一个ASSERT,并显示了文件名和行号,原来是调用了一个没有实现 的函数,我很想知道是谁调用了它,这看似简单的问题却让我很头疼,如果有gdb,那好办-用bt命令就可以搞定,如果用的libc,那也好办-用 backtrace函数就可以搞定,问题是两者都没有。

想来想去只有自己写一个backtrace,要实现这个功能并不难,如果我们知道调用堆栈的格式,就可以很容易取出上层调用者的指令地址,有了这些上层调用者的指令地址,我们可以通过MAP文件找到指令地址对应的源文件名和行号。

下面简要介绍一下实现原理:

要获得调用者的地址,有必要介绍一下堆栈的格式:

+---------------------------+ (高地址)
+_参数1__________+
+---------------------------+
+_参数2__________+
+---------------------------+ 参数的顺序依赖于调用方式
+_参数.__________+
+---------------------------+
+_参数N__________+
+---------------------------+
+_eip____________+ 返回本次调用后,下一条指令的地址
+----------------------------+
+_ebp____________+ 这里保存的调用者的ebp
+----------------------------+
(ebp 指向这里:相当于调用者和被调用者的分界线)
+----------------------------+
+_临时变量1_______+
+----------------------------+
+_临时变量2_______+
+----------------------------+
+_临时变量.________+
+----------------------------+
+----------------------------+
+_临时变量N_______+
+----------------------------+(低地址)
由于优化、调用方式、编译器的不同,上述布局部可能有所不同,但一般来说,第一个局部变量前是调用者的ebp,ebp前是返回后下一条指令的地址。

知道了这个结构,要获得上层调用的者指令地址就容易了,我们可以用如下代码模拟glibc提供的backtrace的功能:
int backtrace (void **BUFFER, int SIZE)
{
int n = 0;
int *p = &n;
int i = 0;

int ebp = p[1];
int eip = p[2];

for(i = 0; i < SIZE; i++)
{
BUFFER[i] = (void*)eip;
p = (int*)ebp;
ebp = p[0];
eip = p[1];
}

return SIZE;
}

附:
通过addr2line可以找到地址对应的文件名和行号,不用手动去查MAP文件了。


=======================
windows系统上面要实现同样的功能,可能要调用 Debug Help Library 里面的StackWalk64 等函数。
http://msdn.microsoft.com/en-us/library/ms680650(VS.85).aspx


找到一个使用StackWalk64 的例子http://www.cppblog.com/kevinlynx/archive/2008/03/28/45628.html
这里又是一个模拟backtrace(stackwalk)函数的例子
http://www.cnblogs.com/lbq1221119/archive/2008/04/18/1159956.html


其实你可以在程序的任何地方调用backtrace和 stackwalk函数的,呵呵
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
........
05-28 10:35:10.921 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(402)-dataCallback:this is syh
05-28 10:35:10.941 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(373)-dataCallback:this is syh
05-28 10:35:10.941 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(382)-dataCallback:this is syh
05-28 10:35:10.941 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(395)-dataCallback:this is syh
05-28 10:35:10.941 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(400)-dataCallback:this is syh
05-28 10:35:10.941 W/AudioRecord(  251): frameworks/av/media/libmedia/AudioRecord.cpp(486)-getInputFramesLost:this is syh
05-28 10:35:10.941 W/AudioSystem(  251): frameworks/av/media/libmedia/AudioSystem.cpp(393)-getInputFramesLost:this is syh
05-28 10:35:10.951 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1503)-getInputFramesLost:this is syh
05-28 10:35:10.951 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1505)-getInputFramesLost:this is syh
05-28 10:35:10.951 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1507)-getInputFramesLost:this is syh
05-28 10:35:10.951 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1509)-getInputFramesLost:this is syh
05-28 10:35:10.951 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(402)-dataCallback:this is syh
05-28 10:35:10.961 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(373)-dataCallback:this is syh
05-28 10:35:10.961 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(382)-dataCallback:this is syh
05-28 10:35:10.961 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(395)-dataCallback:this is syh
05-28 10:35:10.961 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(400)-dataCallback:this is syh
05-28 10:35:10.961 W/AudioRecord(  251): frameworks/av/media/libmedia/AudioRecord.cpp(486)-getInputFramesLost:this is syh
05-28 10:35:10.961 W/AudioSystem(  251): frameworks/av/media/libmedia/AudioSystem.cpp(393)-getInputFramesLost:this is syh
05-28 10:35:10.961 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1503)-getInputFramesLost:this is syh
05-28 10:35:10.961 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1505)-getInputFramesLost:this is syh
05-28 10:35:10.961 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1507)-getInputFramesLost:this is syh
05-28 10:35:10.961 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1509)-getInputFramesLost:this is syh
05-28 10:35:10.961 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(402)-dataCallback:this is syh
05-28 10:35:10.981 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(373)-dataCallback:this is syh
05-28 10:35:10.981 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(382)-dataCallback:this is syh
05-28 10:35:10.981 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(395)-dataCallback:this is syh
05-28 10:35:10.981 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(400)-dataCallback:this is syh
05-28 10:35:10.981 W/AudioRecord(  251): frameworks/av/media/libmedia/AudioRecord.cpp(486)-getInputFramesLost:this is syh
05-28 10:35:10.981 W/AudioSystem(  251): frameworks/av/media/libmedia/AudioSystem.cpp(393)-getInputFramesLost:this is syh
05-28 10:35:10.981 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1503)-getInputFramesLost:this is syh
05-28 10:35:10.981 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1505)-getInputFramesLost:this is syh
05-28 10:35:10.981 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1507)-getInputFramesLost:this is syh
05-28 10:35:10.981 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1509)-getInputFramesLost:this is syh
05-28 10:35:10.981 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(402)-dataCallback:this is syh
05-28 10:35:11.001 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(373)-dataCallback:this is syh
05-28 10:35:11.001 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(382)-dataCallback:this is syh
05-28 10:35:11.001 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(395)-dataCallback:this is syh
05-28 10:35:11.001 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(400)-dataCallback:this is syh
05-28 10:35:11.001 W/AudioRecord(  251): frameworks/av/media/libmedia/AudioRecord.cpp(486)-getInputFramesLost:this is syh
05-28 10:35:11.001 W/AudioSystem(  251): frameworks/av/media/libmedia/AudioSystem.cpp(393)-getInputFramesLost:this is syh
05-28 10:35:11.001 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1503)-getInputFramesLost:this is syh
05-28 10:35:11.001 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1505)-getInputFramesLost:this is syh
05-28 10:35:11.001 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1507)-getInputFramesLost:this is syh
05-28 10:35:11.001 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1509)-getInputFramesLost:this is syh
05-28 10:35:11.001 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(402)-dataCallback:this is syh
05-28 10:35:11.021 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(373)-dataCallback:this is syh
05-28 10:35:11.021 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(382)-dataCallback:this is syh
05-28 10:35:11.021 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(395)-dataCallback:this is syh
05-28 10:35:11.021 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(400)-dataCallback:this is syh
05-28 10:35:11.021 W/AudioRecord(  251): frameworks/av/media/libmedia/AudioRecord.cpp(486)-getInputFramesLost:this is syh
05-28 10:35:11.021 W/AudioSystem(  251): frameworks/av/media/libmedia/AudioSystem.cpp(393)-getInputFramesLost:this is syh
05-28 10:35:11.021 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1503)-getInputFramesLost:this is syh
05-28 10:35:11.021 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1505)-getInputFramesLost:this is syh
05-28 10:35:11.021 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1507)-getInputFramesLost:this is syh
05-28 10:35:11.021 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1509)-getInputFramesLost:this is syh
05-28 10:35:11.021 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(402)-dataCallback:this is syh
05-28 10:35:11.041 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(373)-dataCallback:this is syh
05-28 10:35:11.041 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(382)-dataCallback:this is syh
05-28 10:35:11.041 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(395)-dataCallback:this is syh
05-28 10:35:11.041 W/AudioSource(  251): frameworks/av/media/libstagefright/AudioSource.cpp(400)-dataCallback:this is syh
05-28 10:35:11.041 W/AudioRecord(  251): frameworks/av/media/libmedia/AudioRecord.cpp(486)-getInputFramesLost:this is syh
05-28 10:35:11.041 W/AudioSystem(  251): frameworks/av/media/libmedia/AudioSystem.cpp(393)-getInputFramesLost:this is syh
05-28 10:35:11.041 W/AudioFlinger(  251): frameworks/av/services/audioflinger/AudioFlinger.cpp(1503)-getInputFramesLost:this is syh
05-28 10:35:16.597 W/        (  251): frameworks/av/include/media/stagefright/AMRWriter.h(40)-stop:this is syh

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值