(Здесь, в 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
Любая ПОЛЕЗНАЯ (прямо по делу) помощь? Любое РЕШЕНИЕ? Любой ЭКВИВАЛЕНТНЫЙ путь?
Это чисто вопрос о вашем дистрибутиве Linux. Как правило, они не предоставляют символы отладки автоматически, и вы должны посмотреть их документацию, чтобы узнать, как их получить.
user17732522, вы имеете в виду, что если я «включу» эту функцию обратной трассировки (сначала я должен пройти ее), пример Столлмана будет работать? В том старом посте, который я упомянул, комментатор говорит, что это не настоящая ошибка, а «введенная». Как бы вы решили эту проблему сразу? Какие прямые шаги вы бы сделали с моей позиции, чтобы добраться до этого gdb, зная эту функцию, а также будучи уверенным, что эта предполагаемая ошибка уже находится в этой цели m4? (потому что второй лабиринт будет состоять в том, чтобы сделать этот обратный след хорошо, но добраться до идеально функционирующего m4 в поисках ошибки, которая вообще не выходит). ТЫ.
Почему г-н Столмен не привел просто пример «Hello World!»/hello-world.c? Это необъяснимо. (дело в том, что я изучаю GDB параллельно с другой книгой и у меня есть сложные примеры. И я наивно думал, что книга создателя будет тривиальной, но, похоже, это не так). Лучше использовать проверенный временем пример, а не то, что «зависит от версии или инъекции...». Похоже, это должен быть "трудный путь". Спасибо за ваши идеи.
@nostromo Если вы хотите ответить кому-то, вы должны добавить @
перед их именем пользователя, иначе они не будут уведомлены.
@nostromo Страница, на которую я ссылаюсь, только объясняет, как получить символы отладки для пакета в Debian. (Страница предлагает вам несколько подходов.) На самом деле вас не волнуют обратные трассировки, но основная проблема та же. Я не говорю, что пример тогда будет работать. Но символы отладки необходимы для полезной отладки с помощью отладчика.
@nostromo Я не читал книгу, на которую вы ссылаетесь, но при беглом просмотре мне кажется очевидным, что этот пример не предназначен для повторения. Это демонстрация сеанса отладки, в частности, предварительной версии m4
, которую вы, очевидно, не устанавливали. Это также читается как документация/справочник о самом gdb
и, вероятно, предполагает, что читатель уже имеет необходимые базовые знания, в том числе об отладочных символах, вероятно, самостоятельно компилируя программу, а не используя дистрибутивы.
@ user17732522 Спасибо! Очень полезная информация!!! Отладочные символы (это неизбежная необходимость). И дело в том, что... "чтобы знать, как поставить точку останова" не нужно исчерпывающе использовать старый пример (дело в том, что если пройтись по неизвестным для меня примерам, я мог понять много неявных знаний, а не только команды gdb, но гибкий и правильный образ мышления при отладке: то же самое, что прилагать усилия, чтобы перейти к «полному размещению printf» вместо того, чтобы изучать отладчик и привыкать использовать отладчик, весь его язык, методы и логика».
@ user17732522 Последний вопрос! (никогда не с этим объявлением. LOL): Когда я изучал C++, я прошел BJ. ул. книга "Принципы программирования...". (ОГРОМНОЕ ПОДРАЗУМЕВАЕМОЕ ЗНАНИЕ C++, не говоря уже о «персональных» библиотеках Bj. кто-то здесь в Stackoverflow обратился ко мне Lippman's!Было открытие!Есть ли у вас какие-либо предложения для хорошего источника для изучения GDB?Чтобы крутить кривую обучения?Борьба с программами в сыром виде и поиск в Интернете/pdf-файлах повсюду?
@nostromo К сожалению, у меня ничего нет под рукой. Хороший материал для обучения отладке найти еще труднее, чем материал для обучения C (или C++). Лично я многому научился, просто играя с отладчиком, просматривая документы и т. д. Это не лучший подход для изучения самого языка из-за неопределенных правил поведения, но для изучения отладчика должно быть нормально. Также посмотрите, как работает двоичный формат ELF и какую информацию вы можете найти в нем (например, символы отладки) с помощью шестнадцатеричного редактора. Тогда вы поймете, как отладчик получает информацию.
ОЧЕНЬ ПРОСТОЕ ОБЪЯСНЕНИЕ: первый пример в книге 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, было бы неплохо предоставить встроенный исходный код (текст/приложение) или ссылку на репозиторий или, по крайней мере, версию программы. Также задумался о навязчивой идее автора о распространении знаний.
Прямой вопрос: знаете ли вы версию, в которой живет этот "баг", чтобы я не тратил время на загрузку и компиляцию/связывание версий, которые отлично работают и даже имеют функции, не имеющие ничего общего с упомянутыми в тексте? (Уже спасибо за совет с подсказкой configure && make. Еще одно интересное знание. Большое спасибо).
(Прежде чем опубликовать этот вопрос сегодня), я сделал домашнее задание и просмотрел множество файлов (.c, .h и т. д.) во многих папках версий m4, и я не смог найти ничего подобного тому, что вы указали в своем посте 2009 года: " ...Вы можете загрузить любую версию m4, изменить len_lquote = strlen(lquote); на len_lquote = strlen(rquote); в set_quotes(), а затем повторить образец сеанса отладки....". Так что я уже совсем потерялся.
спасибо большое очень большое Я многое узнаю из твоего объяснения. Это золото для меня. Благодарю вас за ваше усилие. У меня нет слов.
@nostromo Если ответ помог вам, проголосуйте за него. Если это решило вашу проблему, примите это. Мы все здесь работаем за брауни-очки :-)
РЖУ НЕ МОГУ. Вы просто прекрасны! Я узнаю массу вещей с помощью этого поста. Не только техническое! Политический! Психологический! Все! После вашего предложения я нажал «принять» (никогда не делал этого раньше. Я очень новичок в этом. Информация и правила были ошеломляющими. Я начинаю переваривать и хорошо реагировать на многие вещи, которые сообщество ожидает от меня, как и для любого другого 1. Сегодня было как бы мое первое осознанное редактирование поста). Я попытался щелкнуть стрелку вверх, и у меня появилось всплывающее окно: «Спасибо за отзыв! Вам нужно как минимум 15 репутации, чтобы проголосовать, но ваш отзыв был записан».
Даже лучше! Я просмотрел старые сообщения >> я мог «принять» другие ответы >> которые произвели больше репутации >> теперь я мог нажать стрелку вверх»: D ВЕЛИКИЙ ДЕНЬ! НЕТ СОМНЕНИЙ! :D
Тогда нет ссылки на этот пост?