Застрял в книге Столлмана GDB, пытаясь отладить m4 (макропроцессор) пример «ошибки»: исполняемый файл m4, который у меня есть, находится в прямой корзине в /bin (ничего «.../gnu/ ./m4»)

(Здесь, в Stackoverflow, есть еще один пост: (Какую версию m4 использует автор Отладка с помощью GDB?), но ссылки на ответы не работают, и решение не выглядит слишком глубоким или конкретным. У меня есть сказать, что я пробовал их, а также пытался искать другие версии m4 в репозитории gnu, но даже это: «len_lquote = strlen (lquote);» выглядит устаревшим с версии 2006 года, самой старой из найденных).

ОЧЕНЬ ПРОСТОЕ ОБЪЯСНЕНИЕ: первый пример в книге Stallman GDB относится к исполняемому файлу "./m4" (первое странное ощущение с этим "./"), предположительно присутствующему в некоторых (возможно, какой-то старой стандартной установке?): /гну/м4 (?) или /work/Editorial/gdb/gnu/m4/ (?) (и, как я указал, он выглядит выполненным с помощью './', как будто он действительно не был похож на исполняемый файл среды [например, мой «m4», который я установил для этой цели с помощью «sudo apt install m4»]).

Проблема в том, что если я запускаю «gdb m4», он не делает ничего похожего на m4 книги: ДОЛЖНО БЫТЬ (например, установка точки останова в ИЗВЕСТНОЙ функции. ИЗВЕСТНОЙ, потому что я предполагаю, что это должен быть какой-то .c или что-то в этом роде, чтобы GDB загружал / консультировался параллельно с исполняемым файлом, нет?):

(gdb) break m4_changequote 
Breakpoint 1 at 0x62f4: file builtin.c, line 879.

МОЙ:

$ gdb m4               
GNU gdb (Debian 12.1-4+b1) 12.1 Copyright (C)
2022 Free Software Foundation, Inc. (......) Reading symbols from
m4... (No debugging symbols found in m4) 

(gdb) break m4_changequote
Function "m4_changequote" not defined. Make breakpoint pending on
future shared library load? (y or [n]) n

Любая ПОЛЕЗНАЯ (прямо по делу) помощь? Любое РЕШЕНИЕ? Любой ЭКВИВАЛЕНТНЫЙ путь?

Тогда нет ссылки на этот пост?

Solar Mike 11.02.2023 12:12
wiki.debian.org/HowToGetABacktrace
user17732522 11.02.2023 12:18

Это чисто вопрос о вашем дистрибутиве Linux. Как правило, они не предоставляют символы отладки автоматически, и вы должны посмотреть их документацию, чтобы узнать, как их получить.

user17732522 11.02.2023 12:19

user17732522, вы имеете в виду, что если я «включу» эту функцию обратной трассировки (сначала я должен пройти ее), пример Столлмана будет работать? В том старом посте, который я упомянул, комментатор говорит, что это не настоящая ошибка, а «введенная». Как бы вы решили эту проблему сразу? Какие прямые шаги вы бы сделали с моей позиции, чтобы добраться до этого gdb, зная эту функцию, а также будучи уверенным, что эта предполагаемая ошибка уже находится в этой цели m4? (потому что второй лабиринт будет состоять в том, чтобы сделать этот обратный след хорошо, но добраться до идеально функционирующего m4 в поисках ошибки, которая вообще не выходит). ТЫ.

nostromo 11.02.2023 12:45

Почему г-н Столмен не привел просто пример «Hello World!»/hello-world.c? Это необъяснимо. (дело в том, что я изучаю GDB параллельно с другой книгой и у меня есть сложные примеры. И я наивно думал, что книга создателя будет тривиальной, но, похоже, это не так). Лучше использовать проверенный временем пример, а не то, что «зависит от версии или инъекции...». Похоже, это должен быть "трудный путь". Спасибо за ваши идеи.

nostromo 11.02.2023 12:50

@nostromo Если вы хотите ответить кому-то, вы должны добавить @ перед их именем пользователя, иначе они не будут уведомлены.

user17732522 11.02.2023 12:59

@nostromo Страница, на которую я ссылаюсь, только объясняет, как получить символы отладки для пакета в Debian. (Страница предлагает вам несколько подходов.) На самом деле вас не волнуют обратные трассировки, но основная проблема та же. Я не говорю, что пример тогда будет работать. Но символы отладки необходимы для полезной отладки с помощью отладчика.

user17732522 11.02.2023 13:01

@nostromo Я не читал книгу, на которую вы ссылаетесь, но при беглом просмотре мне кажется очевидным, что этот пример не предназначен для повторения. Это демонстрация сеанса отладки, в частности, предварительной версии m4, которую вы, очевидно, не устанавливали. Это также читается как документация/справочник о самом gdb и, вероятно, предполагает, что читатель уже имеет необходимые базовые знания, в том числе об отладочных символах, вероятно, самостоятельно компилируя программу, а не используя дистрибутивы.

user17732522 11.02.2023 13:06

@ user17732522 Спасибо! Очень полезная информация!!! Отладочные символы (это неизбежная необходимость). И дело в том, что... "чтобы знать, как поставить точку останова" не нужно исчерпывающе использовать старый пример (дело в том, что если пройтись по неизвестным для меня примерам, я мог понять много неявных знаний, а не только команды gdb, но гибкий и правильный образ мышления при отладке: то же самое, что прилагать усилия, чтобы перейти к «полному размещению printf» вместо того, чтобы изучать отладчик и привыкать использовать отладчик, весь его язык, методы и логика».

nostromo 11.02.2023 13:13

@ user17732522 Последний вопрос! (никогда не с этим объявлением. LOL): Когда я изучал C++, я прошел BJ. ул. книга "Принципы программирования...". (ОГРОМНОЕ ПОДРАЗУМЕВАЕМОЕ ЗНАНИЕ C++, не говоря уже о «персональных» библиотеках Bj. кто-то здесь в Stackoverflow обратился ко мне Lippman's!Было открытие!Есть ли у вас какие-либо предложения для хорошего источника для изучения GDB?Чтобы крутить кривую обучения?Борьба с программами в сыром виде и поиск в Интернете/pdf-файлах повсюду?

nostromo 11.02.2023 13:23

@nostromo К сожалению, у меня ничего нет под рукой. Хороший материал для обучения отладке найти еще труднее, чем материал для обучения C (или C++). Лично я многому научился, просто играя с отладчиком, просматривая документы и т. д. Это не лучший подход для изучения самого языка из-за неопределенных правил поведения, но для изучения отладчика должно быть нормально. Также посмотрите, как работает двоичный формат ELF и какую информацию вы можете найти в нем (например, символы отладки) с помощью шестнадцатеричного редактора. Тогда вы поймете, как отладчик получает информацию.

user17732522 11.02.2023 13:55
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
11
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

ОЧЕНЬ ПРОСТОЕ ОБЪЯСНЕНИЕ: первый пример в книге Stallman GDB относится к исполняемому файлу "./m4" (первое странное ощущение с этим "./"), предположительно присутствующему в некоторых (возможно, какой-то старой стандартной установке?)

Вы подходите к этой проблеме с неправильным набором предположений.

В общем, вы чаще всего используете GDB в своих собственных программах, т.е. программах, которые вы написали сами. Обычно вы отлаживаете эти программы в каталоге, в котором вы их построили, который является текущим каталогом. В UNIX текущий каталог называется ., и если вы хотите сослаться на программу в вашем текущем каталоге, вы используете нотацию ./program.

В книге Столлман отлаживает m4, над которым он работал и строил.

Вы пытаетесь отладить m4 то, что вы не создавали, и поэтому у вас возникают проблемы при следовании книге.

Я предлагаю вам загрузить исходники m4 и собрать их самостоятельно (это должно быть так же просто, как ./configure && make), а затем следовать книге.

Отладка системы m4 также возможна, но книга не об этом.

Обновлять:

Я сделал свою домашнюю работу и просмотрел множество файлов (.c, .h и т. д.) во многих папках версий m4, и я не смог найти ничего похожего на то, что вы указали в своем посте 2009 года: «... Вы можете скачать любую версию. из m4, измените len_lquote = strlen(lquote); на len_lquote = strlen(rquote); в set_quotes(), а затем повторите пример сеанса отладки. ...".

Пост 2009 года, упомянутый выше, по-видимому, этот.

Я скачал m4 версию, используя:

git clone git://git.sv.gnu.org/m4
cd m4
git checkout branch-1.4

В src/input.c я вижу этот код:

   719  void
   720  set_quotes (const char *lq, const char *rq)
   721  {
   722    free (lquote.string);
   723    free (rquote.string);
   724
   725    /* POSIX states that with 0 arguments, the default quotes are used.
   726       POSIX XCU ERN 112 states that behavior is implementation-defined
   727       if there was only one argument, or if there is an empty string in
   728       either position when there are two arguments.  We allow an empty
   729       left quote to disable quoting, but a non-empty left quote will
   730       always create a non-empty right quote.  See the texinfo for what
   731       some other implementations do.  */
   732    if (!lq)
   733      {
   734        lq = DEF_LQUOTE;
   735        rq = DEF_RQUOTE;
   736      }
   737    else if (!rq || (*lq && !*rq))
   738      rq = DEF_RQUOTE;
   739
   740    lquote.string = xstrdup (lq);
   741    lquote.length = strlen (lquote.string);
   742    rquote.string = xstrdup (rq);
   743    rquote.length = strlen (rquote.string);
   744  }

Очевидно, что len_lquote = strlen(lquote); больше нет, но эквивалентное выражение теперь lquote.length = strlen (lquote.string); в строке 741.

Чтобы ввести ошибку, вы должны изменить строку 741 на lquote.length = strlen (rquote.string);


Но предположим, вы действительно хотите, чтобы источник соответствовал тому, что было описано в книге. Книга была впервые опубликована в 1988 году, а самая первая версия input.c в репозитории Git датирована 2000 годом, поэтому нам нужно найти более старую версию исходников m4.

Я нашел ссылку на m4-1.0.3.tar.Z от 1992 года здесь , а сам файл здесь: http://www.nic.funet.fi/index/gnu/funet/исторический-funet-gnu-area-from-early -1990s/m4-1.0.3.tar.Z

В этом файле TAR m4-1.0.3/input.c действительно есть источник, который вы ищете:

   555  void
   556  set_quotes (char *lq, char *rq)
   557  {
   558    if (lquote != def_lquote)
   559      xfree (lquote);
   560    if (rquote != def_rquote)
   561      xfree (rquote);
   562
   563    lquote = (lq == NULL) ? def_lquote : xstrdup (lq);
   564    rquote = (rq == NULL) ? def_rquote : xstrdup (rq);
   565
   566    len_lquote = strlen (lquote);
   567    len_rquote = strlen (rquote);
   568  }

Осторожно: этот исходный код очень старый и не собирается современными компиляторами (в моем случае GCC-12.2.0). Для его сборки вам понадобится древняя версия GCC.

Привет! Мистер @Employed Russian, теперь я понимаю, что ./ означает, что linux запускает программу, которая находится в текущем каталоге. Я, конечно, очень уважительно отношусь к автору. Очень простая проблема заключается в следующем (и здесь я с радостью принимаю вашу точку зрения на «неправильный набор предположений»): при изучении инструмента/темы можно ожидать наименьших встречных ветров в примерах или маргинальном материале. Даже возвращаясь к примеру m4, было бы неплохо предоставить встроенный исходный код (текст/приложение) или ссылку на репозиторий или, по крайней мере, версию программы. Также задумался о навязчивой идее автора о распространении знаний.

nostromo 11.02.2023 18:34

Прямой вопрос: знаете ли вы версию, в которой живет этот "баг", чтобы я не тратил время на загрузку и компиляцию/связывание версий, которые отлично работают и даже имеют функции, не имеющие ничего общего с упомянутыми в тексте? (Уже спасибо за совет с подсказкой configure && make. Еще одно интересное знание. Большое спасибо).

nostromo 11.02.2023 18:38

(Прежде чем опубликовать этот вопрос сегодня), я сделал домашнее задание и просмотрел множество файлов (.c, .h и т. д.) во многих папках версий m4, и я не смог найти ничего подобного тому, что вы указали в своем посте 2009 года: " ...Вы можете загрузить любую версию m4, изменить len_lquote = strlen(lquote); на len_lquote = strlen(rquote); в set_quotes(), а затем повторить образец сеанса отладки....". Так что я уже совсем потерялся.

nostromo 11.02.2023 19:15

спасибо большое очень большое Я многое узнаю из твоего объяснения. Это золото для меня. Благодарю вас за ваше усилие. У меня нет слов.

nostromo 11.02.2023 20:31

@nostromo Если ответ помог вам, проголосуйте за него. Если это решило вашу проблему, примите это. Мы все здесь работаем за брауни-очки :-)

Employed Russian 11.02.2023 20:57

РЖУ НЕ МОГУ. Вы просто прекрасны! Я узнаю массу вещей с помощью этого поста. Не только техническое! Политический! Психологический! Все! После вашего предложения я нажал «принять» (никогда не делал этого раньше. Я очень новичок в этом. Информация и правила были ошеломляющими. Я начинаю переваривать и хорошо реагировать на многие вещи, которые сообщество ожидает от меня, как и для любого другого 1. Сегодня было как бы мое первое осознанное редактирование поста). Я попытался щелкнуть стрелку вверх, и у меня появилось всплывающее окно: «Спасибо за отзыв! Вам нужно как минимум 15 репутации, чтобы проголосовать, но ваш отзыв был записан».

nostromo 11.02.2023 21:05

Даже лучше! Я просмотрел старые сообщения >> я мог «принять» другие ответы >> которые произвели больше репутации >> теперь я мог нажать стрелку вверх»: D ВЕЛИКИЙ ДЕНЬ! НЕТ СОМНЕНИЙ! :D

nostromo 11.02.2023 21:08

Другие вопросы по теме