TIP게시판

제목 strace 를 이용한 php 디버깅
글쓴이 fnmeat 작성시각 2015/06/11 11:42:31
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 11684   RSS
ci 와는 무관한 내용이기는 한데 공유 차원에서 올려봅니다.

php 디버깅시에 php 소스 내부에서 찾는것도 방법이지만 os 와 관련된 문제일 경우 찾는데 시간이 걸리는 경우가 있습니다. (네트워킹, io, system call 등) 또 php 가 소스를 어떻게 실행하고 있는지 궁금하기도 해서 찾아본 방법중의 하나가 strace 입니다. strace 는 시스템콜을 추적하는 디버깅 툴입니다.

ci2 에서 세션 기능이 제대로 동작하지 않아서 사용하지 않고 있었는데 ci3 에서 어떻게 바뀌었나 봤습니다.
("This detail was at the root of many issues and the main reason why CodeIgniter 3.0 has a completely re-written Session library." 역시나 새로 만들었군요 ㅋㅋ 이번에는 써보려고 합니다.)
그래서 새 코드를 보던 중에 문득 궁금해서 sess_destory() 동작과정을 확인해봤습니다.

ci 의 session->sess_destroy() 는 php 의 session_destroy() 를 실행합니다.
/**
	 * Session destroy
	 *
	 * Legacy CI_Session compatibility method
	 *
	 * @return	void
	 */
	public function sess_destroy()
	{
		session_destroy();
	}
php 의 session_destroy() 레퍼런스를 보면 아래와 같은 설명이 있습니다.
session_destroy() destroys all of the data associated with the current session
그런데 destroy 라는 것이 무엇인지 모르겠습니다. 세션 값을 null 로 만든다는 건지 세션 파일을 없앤다는 건지 등등. strace 로 확인해봅니다.

welcome.php
$this->load->library("session");
$this->session->set_userdata("key", "val");
print_r($this->session->userdata());
$this->session->sess_destroy();
php 동작을 확인하려면 콘솔에서 실행해야 하니 콘솔에서 php index.php 를 실행하면 에러가 나옵니다.
session_destroy(): Trying to destroy uninitialized sessionFilename
session 라이브러리 생성자를 보니 cli 모드를 막아놨군요.
public function __construct(array $params = array())
{
	// No sessions under CLI
	if (is_cli())
	{
		log_message('debug', 'Session: Initialization under CLI aborted.');
		return;
	}
welcome.php 에서 강제로 시작해줍니다.
session_start();
$this->load->library("session");
$this->session->set_userdata("key", "val");
print_r($this->session->userdata());
$this->session->sess_destroy();
$ php index.php 
Array
(
    [key] => val
)
잘 나옵니다. 그러면 이제 strace 로 기록을 남깁니다. 옵션은 -f: child process 기록, -o x.log 저장할 파일 이 2개만 알아도 사용할 수 있습니다.
$ strace -f -o a.log php index.php 
Array
(
    [key] => val
)
a.log 파일을 열어서 session 관련 콜을 찾습니다. 제 컴의 경우 session.save_path = /var/lib/php5 이니 /var/lib/php5 라는 문구로 검색합니다.
$ grep -n "/var/lib/php5" a.log
1160:1507  open("/var/lib/php5/sess_q0eabmif4f5ub1o2a3nn4lrt86", O_RDWR|O_CREAT|O_LARGEFILE, 0600) = 3
1200:1507  unlink("/var/lib/php5/sess_q0eabmif4f5ub1o2a3nn4lrt86") = 0
unlink 를 쓰는군요. 그렇다면 sess_destroy 는 세션 파일 자체를 delete 해버리는 방식이군요. 이제 속이 시원합니다.

위 내용이 맞다면 php 소스에서 unlink 코드를 검증할 수도 있겠는데 다음에 한번 써보겠습니다.
 
태그 strace
 다음글 myISAM와 innodb 엔진의 차이점을 잘 설명해놓... (3)
 이전글 phpstorm과 xdebug 연동하기 (15)

댓글

변종원(웅파) / 2015/06/11 12:03:19 / 추천 0
시스템단 디버깅에 유용하겠네요. 감사합니다. ^^