## Profile
* kcachegrind 를 설치한다. 프로파일 뷰어. 이는 파이썬,c++ 모두에 유효.
``` bash
sudo pip install pyprof2calltree
sudo apt-get install kcachegrind # call tree viewer
```
### C++ profile
* [CMakeLists.txt](./lib/CMakeLists.txt)와 같이 -pg flag를 추가해서 profile에 필요한 정보를 생성하도록 컴파일 옵션을 세팅해야한다.
```
set(CMAKE_CXX_FLAGS `"${CMAKE_CXX_FLAGS} -pg" )
```
### Python profile
1) cProfile
* Profile
``` bash
python -m cProfile -o prof.out scripts/vo.py
pyprof2calltree -i prof.out -k
```
* 한계 : boost python 의 함수는 어쨰선지 profile에 안잡힌다. gperf tools 사용 시도중.
2) Yappi
* 멀티 쓰레드 분석 특화.
* 이번에는 다시 c++ 부분이안됨. 사용 안함.
```
sudo pip install yappi
python -m yappi -o prof.out -f callgrind scripts/vo.py && kcachegrind prof.out
```
3) line_profiler
* 파이썬 프로파일러중 가장 강력하다!. 프로파일 대상인 함수 def 위에 @profile 을 붙여줘야하는 단점이 있지만, 대상 스코프는 라인단위로 확실하게 분석함.
``` python
@profile
def some_target_function(p1, p2):
p3 = p1+p2
p4 = p3 * p3
return p4
```
``` bash
sudo pip install line_profiler
kernprof -l scripts/vo.py && python -m line_profiler vo.py.lprof
```
### Profile python-c extension
* google perftools가 잘 안되서,. yep을 쓰기로함.
```bash
python -m yep -c -o prof.out scripts/vo.py && kcachegrind prof.out
```
python에서 library로 불러온 c++ 부분만 나온다.
python profile결과에서 공백인 부분만, yep에서 인식된다고 보면 되겠음.
* -c는 kcachegrind가 읽는 callgrind 포맷으로 output 파일을 만드는 옵션.
* 결론 : cProfile로 overview를 분석하고, line_profiler로 세부 병목을 찾으면 됨. 해당 병목이 boost python으로 불러온 c++ 함수일 경우, c++ 코드 분석은 yep로 처리하면 코드를 정확하게 분석할수 있음.
* 한번에 분석이 안끝나는게 번거롭지만, 현재 내가 찾은 차선.
* google perftools는 이런 문제가 없는것같은데, 아직 어떻게 쓰는지 이해를 못함.
* https://www.youtube.com/watch?v=DUCMjsrYSrQ
Thursday, August 24, 2017
Friday, August 11, 2017
Debugging boost python shared lib of python ROS node, with gdb
At some_ros_package/scripts/some_node.py
Add next break points for python.
```
if __name__ == '__main__':
from os import getpid
print 'pid = ', getpid()
import pdb;
pdb.set_trace()
```
if pid number is 1234, type next commands at other terminal,
```
$ sudo gdb
gdb) attach 1234
gdb) break ~~~~
gdb) continue
```
After make break point at cppfile, continue python ros node.
```
pdb) continue
```
* If you need symbol file,.
https://stackoverflow.com/questions/20380204/how-to-load-multiple-symbol-files-in-gdb
```
gdb) add-symbol-file filename address
```
Add next break points for python.
```
if __name__ == '__main__':
from os import getpid
print 'pid = ', getpid()
import pdb;
pdb.set_trace()
```
if pid number is 1234, type next commands at other terminal,
```
$ sudo gdb
gdb) attach 1234
gdb) break ~~~~
gdb) continue
```
After make break point at cppfile, continue python ros node.
```
pdb) continue
```
* If you need symbol file,.
https://stackoverflow.com/questions/20380204/how-to-load-multiple-symbol-files-in-gdb
```
gdb) add-symbol-file filename address
```
Thursday, August 10, 2017
3D Vision geometry course
https://www.coursera.org/learn/robotics-perception/lecture/yuawM/bundle-adjustment-iii
Subscribe to:
Posts (Atom)