GDB가 내 테스트 프로그램을 실행할 수 없습니다

GDB가 내 테스트 프로그램을 실행할 수 없습니다

내 컴퓨터는 Ubuntu 14.04를 실행합니다. GDB는 다른 계정에서 비정상적인 것 같습니다. 예를 들어 저는 아주 간단한 테스트를 했습니다. 아래에 ~/test/test.c다음과 같은 파일을 작성했습니다 .

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    printf("hello,world");
    return 0;
}

명령을 사용하여 빌드"gcc -g test.c -o 테스트"을 클릭하면 test.txt라는 결과 파일이 생성됩니다. 다음으로 디버깅을 위해 gdb를 실행합니다. 현재 계정은 내 사용자라는 점에 유의하시기 바랍니다.

$gdb test
(gdb)l      //work well
(gdb) b 6   //work well
(gdb) r     //error: Cannot exec /home/xxx/test/test -c exec /home/xxx/test/test .
            //Error: No such file or directory

그러나 "su" 명령을 통해 루트 계정으로 변경하면 gdb가 제대로 작동합니다. 왜?

답변1

SHELL 변수가 존재하지 않는 파일로 설정된 것 같습니다. 다음을 시도해 보십시오:

export SHELL=/bin/sh
gdb test

/bin/sh그것이 존재하고 실행 가능한지 확인하십시오 . 이는 su루트 권한이 작동해서가 아니라 환경 변수가 su재설정되었기 때문입니다 SHELL. ~에 따르면su 매뉴얼 페이지:

환경의 기본 동작은 다음과 같습니다.

$HOME, $SHELL, $USER, $LOGNAME, $PATH 및 $IFS 환경 변수가 재설정됩니다.

심도 깊은 논의

"다음 오류 메시지에서 이를 어떻게 알 수 있나요?"라고 자문하는 경우:

//error: Cannot exec /home/xxx/test/test -c exec /home/xxx/test/test .
//Error: No such file or directory

당신은 혼자가 아닙니다. 이것은 버그 보고서에서 나온 것 같습니다 gdb. gdb명령을 실행하기 위해 셸을 사용해야 한다고 결정 하면 다음 형식으로 명령을 구성합니다.

/path/to/shell -c exec /path/to/executable

그러나 오류 메시지가 인쇄되면 다음을 수행합니다.

  save_errno = errno;
  fprintf_unfiltered (gdb_stderr, "Cannot exec %s", exec_file);
  for (i = 1; argv[i] != NULL; i++)
    fprintf_unfiltered (gdb_stderr, " %s", argv[i]);
  fprintf_unfiltered (gdb_stderr, ".\n");
  fprintf_unfiltered (gdb_stderr, "Error: %s\n",
                      safe_strerror (save_errno));
  gdb_flush (gdb_stderr);

이는 exec_file명령줄에서 전달하는 파일의 확장된 경로입니다. 먼저 인쇄한 다음 첫 번째 인덱스부터 시작하여 exec_file요소를 인쇄합니다 . 전달되는 매개변수를 포함합니다 .argvargvexecvp

불행하게도 사용하려는 셸은 0번째 요소에 있으며 argv인쇄되지 않습니다. 따라서 execvp찾을 수 없는 파일은 절대 볼 수 없습니다 .

.또한 실제로 전달된 인수 중 하나가 아닌 후행을 인쇄하며 execvp아마도 메시지를 완전한 문장으로 만들기 위한 것입니다.

마지막으로, 호출에서 반환된 오류 execvp, 즉 실행 파일을 찾을 수 없다는 오류를 인쇄합니다.

gdb이 오류는 명령을 직접 실행하려고 할 때와 쉘을 사용할 때 오류 처리 코드가 동일하기 때문에 발생할 수 있습니다 . 전자의 경우 구성된 오류 메시지는 exec_fileargv[0]가 동일하기 때문에 올바르게 보입니다.

관련 정보