Thursday, January 18, 2018

gdb

1. Getting PID / Attach gdb to current process with PID
$ ps l | grep [program]

$ sudo gdb [program]
$ set target-asycn 1
$ attach [pid] &
 ~~~~
$ detach
$ quit

2. Bash command line에서 batch로 gdb  command 입력 

$gdb --ex="set breakpoint pending on" --ex="b some.cpp:13" --ex="r" --ex="plot mat" -args ./bin/ex arg1 arg2

--ex  순서대로 gdb command 자동입력 (배치파일로 입력하는건 다음에 정리)
-args : 프로그래명 arguments 순서대로 입력.

3. Core file 로부터 symbol 불러오기 
Core dump를 bash 에서 명령하는 방법을 주로 이야기하지만, 나는 gdb에서 디버깅하다가 중간에 종료하는 경우가 더 많으므로, gdb 에서 core dump를 하는 방법부터 대신 다룸.

gdb> generate-core-file [core_filename]
$ gdb [program] [core_filename]

Core dump도 debug info 가 필요하므로 bash 의 core dump 명령이든, gdb 의 core dump 명령이든 프로그램은 debug mode나 최소한 RelWithDebInfo 로 빌드되있어야함. 

4. 그외 기본적인 gdb command 
gdb> set breakpoint pending on : 아직 load 되지 않은 shared-lib의 코드에 break point 허용
gdb> b : break point
n : Next
f  [stack number] : 지정된 frame 으로 이동
bt : back trace. stack 의 frame을 나열
info b : break point를 보여줌
generate-core-file : 중단점에 걸린 현재 상태를 core dump. 이후

5. Watching

gdb> rwatch *0xfeedface



References>
https://stackoverflow.com/questions/100444/how-to-set-breakpoints-on-future-shared-libraries-with-a-command-flag

Thursday, December 21, 2017

SSE optimization

https://www.youtube.com/watch?v=GwII1AJzKN4




26:45 : (Visual studio) 디스어셈블리 디버깅
32:36 : go to disassembly


Tuesday, November 7, 2017

Boost python / Cython from ROS catkin build

* 프로젝트에서는 사용했으나, 아래 예제코드로 패키지를 새로 생성해보진 않음.

1. Boost python
1.1  package.xml

<?xml version="1.0"?>
<package format="2">
  <name>some_boost_pkg</name>
  <version>0.0.0</version>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>cmake_modules</build_depend>  # 꼭 필요한지 여부 아직 확인 못함
  <export>
  </export>
</package>

1.2  CMakelists.txt

cmake_minimum_required(VERSION 2.8.3)
project(some_boost_pkg)
add_compile_options(-std=c++11) # boost python 컴파일에 c+11이 필요했던걸로 기억함. 아마도.

find_package(catkin REQUIRED COMPONENTS #0
   ~~~~
)

# 아래의 find_package는 윗줄의 #0 이후에 호출할것.
# 버그인지 모르겠으나, ${Boost_LIBRARIES} 등이 공백으로 덮어씌워지는걸 피하기 위해.
# message(${Boost_LIBRARIES}) 로 확인함.
find_package(cmake_modules REQUIRED)
find_package(PythonLibs 2.7 REQUIRED)
find_package(Boost REQUIRED COMPONENTS system filesystem thread python)


include_directories(include
  ${Boost_INCLUDE_DIRS}

   ${PYTHON_INCLUDE_DIRS}
)

 catkin_package(
  LIBRARIES
    my_boost_lib  # 1
)
add_library(my_boost_lib ${~ boost python source codes ~} )
target_link_libraries(my_boost_lib
    ${PYTHON_LIBRARIES}
    ${Boost_LIBRARIES}
)
set_target_properties(my_boost_lib PROPERTIES
    PREFIX ""
    LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION}
) #2

# 1, #2 가 있어야  compile destination이 CATKIN_WORKSPACE/devel/.private/some_boost_pkg/lib/python2.7/dist-packages/some_boost_pkg/my_boost_lib.so 가 된다.
prefix를 안비우면 파일명이 libmy_boost_lib.so 가 된다.

${~ boost python source codes ~}의 소스코드는 부스트 파이선 튜토리얼 참고.
http://www.boost.org/doc/libs/1_62_0/libs/python/doc/html/tutorial/index.html

2. Cython
2. 1 package.xml

boost python과 같음. 패키지 명만 some_boost_pkg 대신 some_cython_pkg 으로 명명했다고 가정하고 진행.

2. 2 CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(some_cython_pkg)
add_compile_options(-std=c++11)
find_package(catkin REQUIRED)
find_package(cmake_modules REQUIRED)
find_package(PythonLibs 2.7 REQUIRED)

include_directories(includ
  ${catkin_INCLUDE_DIRS}
  ${PYTHON_INCLUDE_DIRS}
)
catkin_package(
  LIBRARIES
      my_cython_lib   # 1
)

catkin_python_setup() # Generate cython_build directory and .c, cxx source codes.
add_library(my_cython_lib
    "cython_build/src/my_cython_codes.c" #3
)
set_target_properties(my_cython_lib PROPERTIES
    PREFIX ""
    LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})  #2

2.3 setup.py

http://wiki.ros.org/rospy_tutorials/Tutorials/Makefile 의 setup.py 파일을 아래와 같이 작성해서 package.xml과 같은 폴더에 저장하면 된다.

#!/usr/bin/python
# -*- coding:utf-8 -*-
## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD

from distutils.core import setup
from catkin_pkg.python_setup import generate_distutils_setup
from Cython.Build import cythonize

#from catkin_tools.context import Context
#ctx = Context.load()
#build_path = ctx.build_space_abs + "/cython_build" # 경로는 취향에 따라.
build_path = 'cython_build'

setup_args = generate_distutils_setup(
    packages=['some_boost_pkg'], # ROS package name
    package_dir={'': 'src'},
    requires=['std_msgs', 'rospy'], # 만약 코드에서 필요하다면
    ext_modules = cythonize("./src/my_cython_codes.pyx", build_dir=build_path) #3의 경로에 c코드를 생성하게함.
)
setup(**setup_args)

2.4  *.pyx

패키지/src 폴더의 my_cython_codes.pyx 파일은 다음 링크의 hello.pyx 코드 참고해서 작성.

3. Result / Test

위와 같은 방법으로 패키지를 생성하고 catkin build를 수행하면, python에서 다음과 같이 함수 호출 가능.

$ python
>>  import some_boost_pkg.my_boost_lib as m1
>>  import some_cython_pkg.my_cython_lib as m2
>> m1.function1()
>> m2.function2() 




Sunday, October 15, 2017

CLi booting + boot prorgram

https://askubuntu.com/questions/826325/how-to-revert-usb-wifi-interface-name-from-wlxxxxxxxxxxxxx-to-wlanx


https://linux.m2osw.com/boot-command-line-console-ubuntu-1604

$ sudo vim /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="text"
GRUB_CMDLINE_LINUX="text"
GRUB_TERMINAL=console

$ update-grub
$ systemctl set-default multi-user.target
$ reboot