'Technical Note'에 해당되는 글 134건

Technical Note/OS X

문제:

PATH 정보를 조회해보니, git과 관련된 bin 디렉토리가 경로의 마지막에 포함되어 있다.


  $ echo $PATH

  ..(중략)..:/usr/local/git/bin


얼마 전 .bash_profile을 정리하면서,

추가적으로 정의하는 PATH 경로는 아래처럼 PATH의 앞 부분에 추가하도록 했었다.

  $ export PATH=새패스:$PATH


어딘가에서 추가되었다면 앞 부분에 있는 게 당연한데,

마지막에 정의되어 있는 것이 이상해 어디서 정의됐는지 파일을 뒤적여봤다.

그리고, /etc/paths.d/git 파일에 정의되어 있는 걸 발견했다.


/etc/paths.d 는 처음 들어 생소한 데다,

/etc/paths 도 자세히 확인해본 적이 없어 잘 모르겠다.


/etc/paths와 /etc/paths.d 의 차이가 뭘까?

PATH는 어떻게 초기화되고 있는 걸까?



해결책:


두 파일 모두 시스템의 초기 PATH를 정의하기 위한 목적으로 사용된다.


/etc/paths 를 조회해보면 각 경로가 아래처럼 라인 단위로 정의되어 있는데,


  /usr/bin

  /bin

  /usr/sbin

  /sbin

  /usr/local/bin


위에서부터 순서대로 각 라인 단위로 PATH 변수에 추가된다.


  /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin


처럼 말이다.



/etc/paths.d 는 디렉토리다.

여기에 초기화 시 필요한 PATH를 파일 단위로 추가할 수 있고,

각 파일에 정의되어 있는 경로가 마찬가지로 라인 단위로 PATH 변수에 추가된다.


/etc/paths.d 에 여러 파일이 존재한다면,

파일 이름의 오름차순 순으로 추가된다.


PATH 경로에 /usr/local/git/bin 이 추가되어 있었던 이유는,

/etc/paths.d/git 파일 내에 해당 경로가 포함되어 있었기 때문이다.



하지만, 사실 /etc/paths 가 시스템의 초기 PATH 정보를 가지고 있는 건 아니다.

직접 /etc/paths 파일을 삭제해보거나 수정해보면 알 수 있는데,

파일을 삭제하더라도 시스템의 중요 경로는 PATH 변수에 정의되어 있다.

(테스트 해보려면, 어드민 권한으로 paths를 삭제하고 새 터미널을 띄워보면 된다)



PATH가 초기화되는 방식을 여러모로 확인해봤다.

맥 OS X 레오파드부터는, /usr/libexec/path_helper 에서부터 PATH가 설정되는데,

전체적인 프로세스는 아래와 같다. (라고 추측한다)


  1. 로그인 쉘이 시작되면 /etc/profile 을 실행한다.

  2. /etc/profile 에서는 /usr/libexec/path_helper 를 실행한다.

  3. path_helper는 /etc/paths 로부터 초기 PATH를 설정한다.

      한 라인 당 하나씩 순서대로 추가한다.

  4. 다음으로 /etc/paths.d 디렉토리에 있는 각 파일로부터 PATH를 설정한다.

      파일 이름의 오름차순 순으로, 각 파일에 정의된 순서대로 추가한다.

  5. 만약, 시스템에 필요한 중요한 경로가 PATH에 누락되어 있다면 추가한다.

      이 떄, 이미 추가되어 있는 것들을 제외하고 추가한다.

      /usr/bin:/bin:/usr/sbin:/sbin 가 PATH에 추가된다.



5번의 항목은, /etc/paths 를 삭제하거나 수정해보면 테스트해볼 수 있는데,

/etc/paths 에서 중요 경로가 누락된 경우, 아래와 같이 초기화된다.


  /etc/paths에서 설정한 경로:/etc/paths.d에서 설정한 경로:중요 경로 중 누락된 것



따라서, 실제 초기화 시점의 PATH를 변경하고자 한다면,

path_helper가 실행되기 전인 /etc/profile 에서 초기화하는 게 가장 좋은 방법이다.



Technical Note/iOS

Following are the steps : 

1) Finder -> Go ->Press alt option (key) -> Library -> Application Support -> iPhone Simulator -> Go to your simulator (It may be 4.0, 5.0, 6.0)


2) If you have folders inside  this path ( Finder -> Go ->Press alt option (key) -> Library -> Application Support -> iPhone Simulator ) then, delete all the folders. It  may clear you after your Xcode build.


3) Suppose you are having a Xcode project whose name is "Test" and you select your scheme as iPhone 5.0 Simulator, then Build + Run your project. 


4) After that you follow 1 & 2 steps ( Finder -> Go ->Press alt option (key) -> Library -> Application Support -> iPhone Simulator ->  5.0 -> Applications -> Randomly 32 digits folder (i.e E8CD6A90-008A-4744-96D1-A104BB44C136) -> Copy 4 items (i.e Documents, Library, tmp, Test file) )


Requirements : You need 4 files ( i.e  Documents, Library, tmp, your binary file (.app) )


Now, if you install this Test binary file onto another mac.


1) You just only need to replace these 4 files into your running Xcode Project.

2) Quit the simulator, if it is already open and then copy 4 files into  this path : Finder -> Go ->Press alt option (key) -> Library -> Application Support -> iPhone Simulator ->  Depends upon what scheme you are running (4.0/5.0/6.0) -> Applications -> Randomly 32 digits folder -> Replace with NEW 4 Files here

3) Open the simulator, No you see "Test" app in your simulator. 



Technical Note/OS X

https://github.com/ghughes/fruitstrap


Install and debug iPhone apps without using Xcode. Designed to work on unjailbroken devices.



Requirements


Mac OS X. Tested on Snow Leopard only.

You need to have a valid iPhone development certificate installed.

Xcode must be installed, along with the SDK for your iOS version.

Technical Note/TEST AUTOMATION

adb -d logcat <your package name>:<log level> *:S

adb -d logcat com.example.example:I



adb shell threadtime

http://shinluckyarchive.tistory.com/487




net.daum.entertainment.music.android



os 버전 : adb shell getprop ro.build.version.release

모델명 : adb shell getprop ro.product.model

시리얼 넘버 : adb get-serialno

sdk  버전 : adb shell getprop ro.build.version.sdkㅡㅐ



Device 정보

Android 모델 

OS  Version

Serial Number

SDK Version




출처 : http://ecogeo.tistory.com/256


안드로이드 시스템 분석에 사용할만한 shell 명령을 알아보자.


시스템 기본 정보: 하드웨어, 커널 등


cat /proc/version : 커널 버전

cat /proc/cpuinfo : 프로세서 정보. CPU 타입, 모델, 제조사 등

cat /proc/meminfo : 메모리 정보. 실제 메모리 및 가상 메모리

cat /proc/devices : 현재 커널에 설정되어 있는 장치 목록

mount : 마운트된 모든 장치 정보

df : 하드디스크 사용량

cat /proc/filesystems : 커널에 설정되어 있는 파일시스템 목록

cat /proc/swaps : 스왑 파티션의 크기와 사용량

cat /proc/interrupts : 장치가 사용중인 인터럽트(IRQ) 목록 표시

cat /proc/ioports : 현재 사용중인 Input/Output 포트

cat /proc/loadavg : 시스템의 평균부하량

cat /proc/partitions : 파티션 정보

cat /proc/uptime : 시스템이 얼마나 살아있었는지.

cat /proc/stat : 시스템 상태에 관한 다양한 정보. CPU 사용통계, 부팅이후 page fault 발생횟수 등

cat /proc/zoneinfo : ZONEINFO ?

dmesg : 시스템 부팅시 나왔던 메시지

ps : 실행중인 프로세스 정보

ps -p -t : 프로세스와 쓰레드 목록

set 또는 printenv : 환경설정값 출력


시스템 리소스 사용 현황


vmstat : 시스템의 리소스 상황 모니터링. CPU, I/O, 메모리 등

cat /proc/diskstats : 디스크 utilization과 throuthput. 즉 디스크 IO 현황

top : 시스템의 프로세스 상황 모니터링. 프로세스별 CPU 사용량, 메모리와 스왑 사용량 등

procrank : 프로세스별 메모리(VSS,RSS,USS, PSS)

dumpsys meminfo [PID] : 해당 프로세스의 메모리 상세 정보

cat /proc/[PID]/stat : 해당 프로세스에 대한 정보. 시작시간, 상태, CPU 사용량 등

cat /proc/[PID]/maps : 해당 프로세스의 메모리 맵 정보

cat /proc/vmstat : 버추얼 메모리 통계?

librank : 라이브러리별 메모리 사용량?


네트워크 관련


cat /proc/net/netlink : 네트워크 정보

netcfg : 네트워크 인터페이스와 IP주소 목록

netstat : 네트워크 연결상태 확인

nc : 네트워크용 cat 명령어(netcat)

ifconfig : 네트워크 인터페이스 설정 정보. 장치명을 파라미터로 받음. IP 주소, 서브넷마스크 등

tcpdump : 실시간 패킷 모니터링

iftop : 네트워크를 위한 top

route : 해당 호스트까지 연결하는 중간 경로 정보인 라우팅 테이블 표시

ping : 원격 호스트와의 연결 테스트

cat /proc/net/route : Routes


안드로이드 제공


logcat : 로그캣 보기

pm : package manager의 약자. 패키지/permission/instrumentation/feature 목록, 패키지 설치/제거 등

am : activity manager의 약자. 액티비티 시작, Intent 브로드캐스팅, Instrumentation 시작, profiling 시작/중지 등

service : 안드로이드 서비스 목록 표시, 서비스에 명령 전달

monkey : 애플리케이션에 랜덤 이벤트 발생시킴. 사용자 이벤트, 시스템 이벤트의 무작위 발행

cat /data/anr/traces.txt : VM TRACES (쓰레드 덤프)

cat /proc/binder/proc/[PID] : 바인더 프로세스 상태

cat /proc/binder/xxx : 바인더 관련 정보(xxx는 transactions, transaction_log, failed_transaction_log, stats 등)

cat /data/system/packages.xml : 설치된 패키지 세팅 정보

setprop : system property 세팅

getprop : 세팅된 system property 목록 출력



종합 리포트

dumpsys [service]: app/service 상태정보 덤프. 서비스별로 추가 파라미터 받을 수 있음

dumpstate : device 상태정보 덤프(cpu,mem,ps 등). 상태정보를 추출하는 여러 명령어들의 조합으로 구성

dumpcrash : 애플리케이션이 crash될 때의 상태정보 덤프?

bugreport : logcat+dumpsys+dumpstate


그밖에...

그밖의 안드로이드 shell 명령어는 /system/bin 및 /system/xbin을 뒤져보면 많이 나온다. 이제 남은 일은 찾아낸 명령어의 사용법, 출력결과를 어떻게 해석할지, 어떤 상황에서 이들을 활용할지 사례조사, 그리고 직접 활용해보는 것일게다.




* 참조


http://www.cyworld.com/polox94ii/312644


http://tkhwang.pe.kr/archives/65


http://en.androidwiki.com/wiki/ADB_Shell_Command_Reference


http://elinux.org/Using_Bootchart_on_Android


http://elenoa.tistory.com/52









*** Android Debug ***


* Kernel Debug

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

* adb shell

- cat proc/kmsg : kernel 로그 메세지를 볼 수 있음.


   adb devices 로 폰 연결확인

   adb shell

   > cat /proc/kmsg&  커널메시지 나옴 ex: <number>형식

   > logcat&          플랫폼메시지 나옴 

   adb logcat -b radio > xxx.txt 릴 로그


dmesg : 가장 최근 메세지 출력

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


* kernel message 찍기 (파일이름, 함수이름, 라인넘버)

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

printk(KERN_ERR "%s : %s : %d \n, __FILE__, __func__, __LINE__)

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


* 부팅시 Serial 로 메세지 찍는 방법

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

setenv SWITCH_SEL 3

saveenv


로그 레벨 변경하는 방법

----

setenv CMDLINE console=ttySAC2,115200 loglevel=7

saveenv


현재 상태 보는 방법

----

printenv



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


* emergency mode 들어가는 법: anyway function 부분 2,6번 내리고 폰연결하면 들어간다.




- wake lock 보는 방법

---------

#cat /sys/power/wake_lock



- wake unlock 보는 방법

---------

#cat /sys/power/wake_unlock



- wake lock setting 방법

---------

#echo test > /sys/power/wake_lock



- wake unlock setting 방법

---------

#echo test > /sys/power/wake_unlock



- 현재 wake lock 보는 방법

---------

#cat /proc/wakelocks


- Threads 보는 방법

---------

#ps

#ps -t


- Thread 죽이는 방법

---------

#kill "PID"

#kill -9 "PID"


- dumpsys 보는 방법

---------

#dumpsys power

#dumpsys alarm



- 의심되는 Thread 가 있을 경우에 확인 방법

의심되는 Thread의 PID를 확인후에

#cd proc

#cd "PID"

#cat wchan (현재 상태 확인)

#cat cmdline (매개변수 확인)


-속성 변경하는 방법 (read, write)

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

    chown system system /data

    chmod 0771 /data

-----------

위 부분의 속성을 system으로 바꿔서 read write 가능하게 하려면~

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

    chown system system /system

    chmod 0771 /system

-----------

이렇게 하면 apk 파일을 지울수 있다.



adb logcat  -v time -b main -b radio -b events -b system 2>&1|tee 00_logcat.log 


Technical Note/JAVA

java에서 동영상의 스틸컷을 추출하기 위해 ffmpeg을 Runtime.exec()로 실행하는데, ffmpeg이 실행이 종료되지 않고 뭄추는 현상이 발생했다. 확인해 본 결과 ffmpeg이 쏫아내는 에러 출력 메시지 때문이었다. Runtime.exec()로 ffmpeg Processor를 생성한 뒤에 아래 코드와 같이 에러 출력 스트림으로부터 데이터를 읽어오기만 하면 블록킹 없이 ffmpeg이 실행된다.

참고로, 위 코드는 동영상으로부터 특정 시점의 썸네일 이미지를 추출하는 코드이다.



public File extractImage(File videoFile, int position,

File creatingImageFile) {

try {

int seconds = position % 60;

int minutes = (position - seconds) / 60;

int hours = (position - minutes * 60 - seconds) / 60 / 60;


String videoFilePath = videoFile.getAbsolutePath();

String imageFilePath = creatingImageFile.getAbsolutePath();


String[] commands = { "ffmpeg", "-ss",

String.format("%02d:%02d:%02d", hours, minutes, seconds),

"-i", videoFilePath, "-an", "-vframes", "1", "-y",

imageFilePath };


Process processor = Runtime.getRuntime().exec(commands);


String line1 = null;

BufferedReader error = new BufferedReader(new InputStreamReader(

processor.getErrorStream()));

while ((line1 = error.readLine()) != null) {

logger.debug(line1);

}

processor.waitFor();

int exitValue = processor.exitValue();

if (exitValue != 0) {

throw new RuntimeException("exit code is not 0 [" + exitValue

+ "]");

}

return creatingImageFile;

} catch (IOException e) {

throw new RuntimeException(e);

} catch (InterruptedException e) {

throw new RuntimeException(e);

}

}

1 2 3 4 5 6 7 8 ··· 27
블로그 이미지

zzikjh