sonumb

gdb로 브레이크 포인트를 조건과 함께 걸어놓은 곳에 잘 걸리지 않을 경우 본문

개발자 이야기

gdb로 브레이크 포인트를 조건과 함께 걸어놓은 곳에 잘 걸리지 않을 경우

sonumb 2019. 3. 1. 18:29

프로그램이 죽는 현상 혹은 디버깅을 해야하는 어떤 상황을 재현하기 위해 gdb 내에서 실행하는 경우가 종종있다.

그러나 이럴때 재현되지 않는 경우가 종종있다. 프로그램을 실행시킨다면, 또다시 오류상황이 발생.. -_-;

이유야 여러가지가 있겠으나, 멀티쓰레드 환경, 디버깅 옵션 유무, 옵티마이징 레벨, 실행하던 하드웨어(CPU) 등등이 있다.

여튼 이런 것을 디버거로 실행하는 것은, 벌레와의 전쟁에서 백전백패를 의미한다.


이럴땐 프로그램에 "죽는 조건 혹은 어떤 조건을 만족하는 순간이 온다면 디버깅툴로 attach하는 코드"를 기입하는 방법이 있다.

그러나 gdb나 cgdb와 같이 CUI 프로그램을 다른 창에 띄워서 어태치하는 방법은 힘들다. 

이럴땐 ddd라는 GUI로 된 디버깅 툴을 이용한다.

아래 코드를 적절히 이용하면 좋을 것이다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libgen.h>
#include <limits.h>
 
char * g_program_path = NULL;
 
int execute_ddd( sec )
{
  char * cmdstr = (char *) malloc( sizeof(char) * PATH_MAX * 2 );
  if( cmdstr )
    {
      sprintf(cmdstr,
              "echo \"ddd %s %d &\" > ./run_ddd.sh",
              g_program_path,
              getpid() );
 
      system(cmdstr);
 
      system("sh ./run_ddd.sh");
      sleep( sec );
 
      free(cmdstr);
    }
 
  return 0;
}
 
int main( int argc, char * argv[] )
{
  g_program_path = argv[0];
 
  if( 1 ) // debugging conditions would be here
    {
      execute_ddd( 10 );
    }
 
  return 0;
}





반응형