조회 수 18698 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files

1. c, c++에서.

1
2
3
4
5
6
7
8
9
external/bluetooth/bluedroid$ cat bta/sys/dump_stack.cpp
#include <utils/CallStack.h>
using namespace android;
extern "C" void dump_stack_android(void)
{
        CallStack stack("MY_DEBUG");
}

2. JAVA에서

1
2
3
import android.util.Log;Log.e("MY_DEBUG", new Throwable().getStackTrace()[0].getMethodName());



=======================================================================



KK 이후 버전에서는 위 코드는 오류가 나며 다른 방법으로 지원된다.



Kernel

아래와 같이 다양한 콜 스택 출력 방법이 있다.

 dump_stack()

 BUG_ON(), WARN_ON()

 save_stack_trace()

 dump_trace()

  backtrace()

개인적으로 즐겨쓰는 두 가지 예를 아래에 설명한다.


1) dump_stack

헤더를 포함하고 dump_stack() 추가하면 끝.

#include <linux/kernel.h> 

dump_stack();


2) WARN_ON 사용

조건 필요 없이 콜 스택 표시하고 싶을 때 사용하는 코드.

WARN_ON (0);


조건을 검사하여 콜 스택 표시하는 코드.

WARN_ON (!sdio_claimed);



====================================================================================



먼저 안드로이드가 제공하는 util 중에서 callstack 을 include 합니다.
#include <utils/CallStack.h>

그리고 콜스택을 찍으려고 하는 곳에 다음과 같이 넣습니다.
CallStack stack;
stack.update(0, 31);
stack.dump();

위에서 한 내용은 최대 call stack 을 31개까지 찍겠다 (최대값이 31 입니다) 라고 한 것입니다. 
그런데 이렇게만 하면 안되고 CallStack.cpp 에서 dump() 함수에서 실제 call stack 을 LOGD 로 찍고 있는데 이것을 LOGE 로 바꿔줘야 call stack 이 로그로 출력이 됩니다.

이렇게 call stack 을 보면 
01-01 00:38:12.860: ERROR/CallStack(188): #00  0x0x4018c100: <_ZN7android9CallStack6updateEii>+0x0x4018c0e1
01-01 00:38:12.860: ERROR/CallStack(188): #01  0x0x400deaae: <_ZN7android12AudioFlinger10onFirstRefEv>+0x0x400dea81
01-01 00:38:12.860: ERROR/CallStack(188): #02  0x0x400df826: <_ZTv0_n16_N7android12AudioFlinger10onFirstRefEv>+0x0x400df819
01-01 00:38:12.860: ERROR/CallStack(188): #03  0x0x4018da58: <_ZNK7android7RefBase9incStrongEPKv>+0x0x4018da31
01-01 00:38:12.860: ERROR/CallStack(188): #04  pc 0000093a  /system/bin/mediaserver
01-01 00:38:12.860: ERROR/CallStack(188): #05  0x0x4010452e: <__libc_init>+0x0x40104505

이런 식으로 찍히게 되는데, 자세히 보면 위에 내용이 무엇인지 알 수 있습니다.
제는 위 코드를 AudioFlinger.cpp 에서 audio flinger 가 binding 되는 순간에 불리는 onFirstRef() 안에서 찍었는데 그것을 감안해서 보면,
mediaserver -> RefBase 소스에서 incStrong() -> AudioFlinger 소스에서 onFirstRef() 이렇게 호출된 것을 볼 수 있습니다.


출처 : http://shadowxx.egloos.com/10816752






Dump_stack in Android Native C Code


1 Wrapper Android C++ method into a C function:

1
2
3
4
5
6
7
8
9
external/bluetooth/bluedroid$ cat bta/sys/dump_stack.cpp
#include <utils/CallStack.h>
using namespace android;
extern "C" void dump_stack_android(void)
{
        CallStack stack;
        stack.update();
        stack.dump();
}

* KK부터는 안되니 이렇게 하자.

CallStack stack("mytag");

stack.update();

//stack.dump();

stack.log("tag", ANDROID_LOG_ERROR, "tag");



2 Call this C function from target place:

1
2
3
4
5
6
7
diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c
+extern void dump_stack_android(void);
 static void bta_dm_adjust_roles(BOOLEAN delay_role_switch)
 {
+    dump_stack_android();
     if(bta_dm_cb.device_list.count)
     {

3 Add library libutils as dependency in LOCAL_SHARED_LIBRARIES,

1
2
3
4
5
6
7
8
diff --git a/main/Android.mk b/main/Android.mk
 LOCAL_SRC_FILES+= \
 +       ../bta/sys/dump_stack.cpp \
         ../udrv/ulinux/uipc.c

 LOCAL_SHARED_LIBRARIES := \
     libcutils \
+    libutils \

I met a ld error as:

1
error: undefined reference to 'android::CallStack::CallStack()'

It turned out that I added the libutils dependency into a static library libbt-brcm_bta, which can not solve this dynamic symbol at link time

Move the dependency to dynamic library bluetooth.default.so solved the problem.

The final result on running board is:

1
2
3
4
5
6
7
8
9
10
11
12
root@android:/ # logcat -v time |grep CallStack&
05-09 21:01:57.666 D/CallStack( 2133): (null)#00  pc 0005c444  /system/lib/hw/bluetooth.default.so (dump_stack_android+15)
05-09 21:01:57.666 D/CallStack( 2133): (null)#01  pc 0004ddb2  /system/lib/hw/bluetooth.default.so
05-09 21:01:57.666 D/CallStack( 2133): (null)#02  pc 0004c310  /system/lib/hw/bluetooth.default.so (bta_sys_conn_close+27)
05-09 21:01:57.666 D/CallStack( 2133): (null)#03  pc 000577d4  /system/lib/hw/bluetooth.default.so (bta_av_str_closed+115)
05-09 21:01:57.666 D/CallStack( 2133): (null)#04  pc 0004705e  /system/lib/hw/bluetooth.default.so (bta_av_ssm_execute+269)
05-09 21:01:57.666 D/CallStack( 2133): (null)#05  pc 00046f1c  /system/lib/hw/bluetooth.default.so (bta_av_hdl_event+159)
05-09 21:01:57.666 D/CallStack( 2133): (null)#06  pc 0004bf02  /system/lib/hw/bluetooth.default.so (bta_sys_event+49)
05-09 21:01:57.666 D/CallStack( 2133): (null)#07  pc 00074b70  /system/lib/hw/bluetooth.default.so (btu_task+559)
05-09 21:01:57.666 D/CallStack( 2133): (null)#08  pc 00042784  /system/lib/hw/bluetooth.default.so (gki_task_entry+91)
05-09 21:01:57.666 D/CallStack( 2133): (null)#09  pc 0000e3d8  /system/lib/libc.so (__thread_entry+72)
05-09 21:01:57.666 D/CallStack( 2133): (null)#10  pc 0000dac4  /system/lib/libc.so (pthread_create+160)

This result can be verified as the same as addr2line:

1
2
$ arm-eabi-addr2line -e ../../../out/target/product/bg2ct_dmp_emmc/symbols/system/lib/hw/bluetooth.default.so 0004c310
external/bluetooth/bluedroid/bta/./sys/bta_sys_conn.c:236

Update: Peek stack of a running process

Android debuggerd can be used to dump a running process’s stack:

1
2
3
4
5
6
7
8
9
10
11
12
13

ALOGD("peeking stack of process %d\n", pid);
kill(pid, SIGSTOP);
ptrace(PTRACE_ATTACH, pid, 0,0);
char *tombstone_path = engrave_tombstone(pid,
      pid,
      0/*no signal*/,
      true /*dump_sibling_threads*/,
      false /*not quiet*/,
      &detach_failed,
      &total_sleep_time_usec);
ptrace(PTRACE_DETACH, pid, 0, 0);
kill(pid, SIGCONT);

The stack of main thread of the process will shown in logcat, and all others will be in the tombstone file. The target process will resume to execution right after the dump stack finished. This is useful when debugging some real time issues.


출처: http://yongbingchen.github.io/blog/2013/05/09/dump-stack-in-android-native-c-code/


Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
491 C# 텍스트 파일에서 읽기/쓰기 2013.08.08 13018 0
490 JAVA 텍스트 파일 읽기, 쓰기 2015.10.21 13156 0
489 일반 탐색기 오른쪽 팝업메뉴에 항목 추가하기 2005.08.05 42199 0
488 Android 킷캣에서 바뀐 점 정리 2014.01.26 12222 0
487 Pi 키르히호프의 법칙 2016.12.05 10698 0
486 C 퀵 정렬 Quick Sort file 2005.08.10 38916 0
485 C 콘솔 창에서 글자 색깔 바꾸기 2005.08.05 27412 0
484 C# 컬렉션(Collection) - ArrayList / HashTable / Queue / Stack 2012.11.12 16176 0
483 Pi 커패시터 용량, 오차 및 정격전압 판별법 (Capacitor Code) file 2016.11.21 15954 0
482 LINUX 커맨드라인에서 url 접근 - wget 사용법 2015.09.30 12203 0
481 MFC 커맨드 창 속성 제어 2009.09.01 38093 0
480 Python 커맨드 라인에서 컬러로 출력하기 termcolor 2014.06.27 10718 0
479 Android 카톡 SDK 의 안드로이드 기기 unique ID 얻기 방법 2015.01.02 15823 0
478 Pi 칩 저항 사이즈표, 사이즈변환, 와트, 오차표 2019.01.11 10737 0
477 Python 줄 바꿈 없이 출력하는 방법 2019.03.30 7172 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 34 Next ›
/ 34

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5