내 컴퓨터는 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
요소를 인쇄합니다 . 전달되는 매개변수를 포함합니다 .argv
argv
execvp
불행하게도 사용하려는 셸은 0번째 요소에 있으며 argv
인쇄되지 않습니다. 따라서 execvp
찾을 수 없는 파일은 절대 볼 수 없습니다 .
.
또한 실제로 전달된 인수 중 하나가 아닌 후행을 인쇄하며 execvp
아마도 메시지를 완전한 문장으로 만들기 위한 것입니다.
마지막으로, 호출에서 반환된 오류 execvp
, 즉 실행 파일을 찾을 수 없다는 오류를 인쇄합니다.
gdb
이 오류는 명령을 직접 실행하려고 할 때와 쉘을 사용할 때 오류 처리 코드가 동일하기 때문에 발생할 수 있습니다 . 전자의 경우 구성된 오류 메시지는 exec_file
과 argv[0]
가 동일하기 때문에 올바르게 보입니다.