WedX - журнал о программировании и компьютерных науках

ошибка сегментации при чтении значения, которое хорошо определено в gdb

У меня сейчас большая проблема. Я получаю ошибку сегментации в своем коде, и я прошел через нее с помощью отладчика. Из объекта я читаю элемент const char* name, чтобы распечатать его с помощью printf. И вот где мой segfault приходит. Я бы предположил, что указатель на объект недействителен, но из gdb я могу проверить все значения этого объекта, и содержимое name именно то, что должно быть. Я абсолютно не знаю, почему я получаю ошибку сегментации.

Так по каким причинам моей программе не разрешено читать некоторые данные, а gdb разрешено?

edit: для тех людей, кто еще не понял, я никого не прошу исправлять мои проблемы, я просто хочу знать, как и в каких сценариях отладчику разрешено читать некоторые данные, а моей программе нет . Я добавил скриншот в качестве доказательства того, что я ничего не придумываю, но мне не нужно, чтобы вы понимали мой код.

Просто немного угловой информации. Моя программа представляет собой плагин для приложения Qt. Он использует API плагинов Qt для загрузки плагинов через lib<PluginName>.so.

g++ (Debian 4.9.2-10) 4.9.2 GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1

редактировать: я добавил скриншот, чтобы лучше увидеть проблему. Инициализация выполняется в конструкторе.

доказательство.

class PickingHandler {
public:
    const char* name;
    PickingHandler(const char* name) : name(name) {}
    [...]
    virtual void Drag(PickResult) = 0;
};

class ConnectHandler : public PickingHandler {
public:
    ConnectHandler() : PickingHandler("connect handler") {}
    [...]
    void Drag(PickResult) override;
};

  • Пожалуйста, покажите код, который присваивает значение name и как он используется. 29.09.2015
  • Пожалуйста, покажите инициализацию и использование строки в printf. 29.09.2015
  • Эти скриншоты бесполезны - просто лень 29.09.2015
  • у вас есть name().toUtf, но печатайте простое имя. Является ли имя функцией или чистыми данными? 29.09.2015
  • @Arne - Возможно, просмотр веб-страницы с моей точки зрения может помочь. (пс. не я один такой) 29.09.2015
  • @ pm100 Я добавил для этого код, который вы можете видеть, это просто const char* справа, вы можете увидеть отладчик со значением "connect handler" 29.09.2015
  • @basav хорошо, я добавляю части кода, которые инициализируют имя. name задается через конструктор. Нет другого конструктора, который позволил бы не устанавливать name 29.09.2015
  • @CoryKramer, не могли бы вы оставить комментарий, почему вам не нравится мой вопрос, то, что я в ожидании, не помогает ни мне, ни кому-либо еще. 29.09.2015
  • @EdHeal, пожалуйста, я работаю над своими вещами, чтобы прояснить ситуацию. То, что вы откладываете мой вопрос, не помогает мне. 29.09.2015
  • @Sneftel, не могли бы вы оставить комментарий, почему вы думаете, что мой вопрос должен быть закрыт? 29.09.2015
  • @josilber, не могли бы вы написать, что мой вопрос нужно открыть повторно? 29.09.2015
  • @BoPersson, не могли бы вы оставить комментарий, что, по вашему мнению, нужно, чтобы снова открыть этот вопрос? 30.09.2015
  • вопрос в том, является ли значение читаемым из имени или printf умирает из-за какой-то другой ошибки (ранее поврежденный стек, куча ..). попробуйте имя strduping, чтобы увидеть, действительно ли оно читаемо. Также, если это Linux, запустите его под valgrind 30.09.2015
  • @ pm100 printf отлично работал в строке над ошибкой. strdup по имени тоже дает сбой. Таким образом, значение действительно не читается. Но отладчик сообщает, что у него правильное значение, как вы можете видеть на скриншоте, который я сделал. 30.09.2015

Ответы:


1

Самая распространенная причина (и единственная причина, по которой я когда-либо видел это), почему GDB может прочитать строку, а программа не может, это когда данные находятся на странице без PROT_READ.

Ошибкой ядра Linux можно считать то, что ptrace(PEEK_DATA, ...) (системный вызов, который GDB использует для чтения данных подчиненной (отлаживаемой) программы) завершается успешно, когда адрес не имеет разрешений на чтение и сама программа не может прочитать этот адрес.

Вы можете использовать info proc maps в GDB, найти область памяти, которая соответствует (охватывает) необработанный адрес plugin->picking_handler->name, и посмотреть, каковы его разрешения.

См. также этот ответ.

30.09.2015
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]