Как исполняемый файл может быть отлажен при его изменении - PullRequest
0 голосов
/ 16 июня 2020

Вот сценарий, о котором я спрашиваю:

  • gdb отлаживает исполняемый файл некоторой программы
  • программист находит ошибку (хорошо!)
  • исправляет программист код и повторно компилируется (отлично!)
  • программист понимает, что он не выходил из gdb, поэтому он работал все это время
  • , а именно , пока был написан исполняемый файл и ОС (Linux) это разрешили.

Почему это возможно?

Разве мне не должно быть сообщение об ошибке ОС, например "file is being used by another application (gdb)"

1 Ответ

1 голос
/ 16 июня 2020

Разве я не должен получать сообщение об ошибке ОС, например

Это зависит.

Предположим, ваша команда перестройки - gcc -o foo t.c.

Это команда может либо open(2) foo для записи, либо она может записывать во временный файл foo.$uniqsuffix и rename(2) временный файл foo в случае успеха, или может unlink(2) foo и создавать и записывать в новый foo.

Только первый вариант - попытка записи в оригинал foo завершится неудачно с ETXTBSY.

Выполняется strace -fe file gcc -o foo t.c |& grep foo в моей системе (Ubuntu) отображается:

[pid 116892] stat("foo", {st_mode=S_IFREG|0750, st_size=16520, ...}) = 0
[pid 116892] lstat("foo", {st_mode=S_IFREG|0750, st_size=16520, ...}) = 0
[pid 116892] unlink("foo")              = 0
[pid 116892] openat(AT_FDCWD, "foo", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
[pid 116892] stat("foo", {st_mode=S_IFREG|0640, st_size=16520, ...}) = 0
[pid 116892] chmod("foo", 0750)         = 0

Итак, в этой системе компоновщик использует стратегию unlink + создания нового файла, и ошибок не ожидается.

См. this ответьте на , почему вы можете продолжить отладку исходной программы даже после того, как она была перестроена.

...