Как изучить отладку C и [закрытые] лучшие практики

Похоже, что интерпретатор Python, встроенный в Gimp 2.10, использует / в качестве разделителя пути, тогда как Gimp 2.10 использует \ в Windows.

Этот вопрос обсуждается здесь .

Создание файла с именем C:\Program Files\GIMP 2\32\lib\python2.7\sitecustomize.py со следующим содержимым, по-видимому, решает проблему.

import sys
class Issue1542:
    def __del__ (self):
        if len (sys.argv[0]):
            from os.path import dirname
            sys.path[0:0] = [dirname (sys.argv[0])]
sys.argv = Issue1542 ()

7
задан Mike B 12 January 2009 в 15:29
поделиться

6 ответов

Я уверен, что отлаживающие методы в целом независимы от языка и существует не такой думать "C отладка".
Существует много другого инструмента, который может помочь Вам найти простые проблемы как утечка памяти или просто глупые ошибки в коде, несколько раз это даже может поймать простые переполнения памяти. Но для очень трудно для нахождения проблем как проблемы порожденными из многозадачности/прерывания dma повреждение памяти единственный инструмент является мозговым и правильно написанным кодом (с размышлением заранее, что этот код будет отлажен). Можно найти больше о подготовке кода к отладке здесь. Это кажется из сообщения Sydius, тот Apache уже имеет в распоряжении хороший механизм трассировки, поэтому просто использует его и добавляет подобный Вашей кодовой базе.
В дополнительном я сказал бы, что другой важный шаг в отладке, "не принимают/думают". Основывайте все свои шаги на пустых фактах, докажите все Ваше предположение с 100%-й точностью перед Вами делающий другой шаг на основе того предположения. Базирование Вашей отладки на предположении обычно будет приносить Вам к неправильному направлению.

Редактирование после разъяснения Dave:

Вы затем ступаете, должна быть находка самая маленькая часть кода, которые вызывают проблему. Вы печальный это, если Ваш запрещать определенный раздел модуль загружается. просто сделайте этот раздел, поскольку маленький возможно, удалите/осел все в разделе, пока Вы не найдете идеально одну строку, которая заставит модуль не загружаться. И после нахождения этой строки. это будет точное время, чтобы начать использовать Ваш мозг :) Просто не забывайте к 100%, проверяют, что это - строка.

3
ответ дан 6 December 2019 в 15:36
поделиться

К сожалению, инструменты GNU не являются лучшими, и мой опыт состоит в том, что динамический компоновщик пачкает воды чрезвычайно. Если можно заставить Apache связываться статически с модулем, который позволит gdb особенно работать более надежно. Я не знаю, как легкий, который является; много зависит от системы сборки Apache.

Это является беспокоящим, но не шокирующим, что Вы не можете легко воспроизвести ошибку с valgrind.

Относительно компиляции с правильными флагами и valgrind и gdb дадут Вам намного лучшую информацию при компиляции всего в поле зрения с -g -O0. Не верьте требованиям на gcc странице справочника это gcc -g -O достаточно хорошо; это не---даже -O заставит переменные в исходном коде быть устраненными оптимизатором.

5
ответ дан 6 December 2019 в 15:36
поделиться

Очень общие рекомендации:

  • Посмотрите снова на тот след. Какой-либо из стековых фреймов в коде, Вы управляете? Если так, что строка, и что происходит там?

  • Вы знаете что dlopen() ? Если не читает руководство. Если след не включает ни одного из Вас код, это может перестать работать в то время Apache попытки загрузить Ваш код. Вы уверены, что создали модуль с правильными параметрами компилятора?

  • Эффективная отладка требует знания Вашей среды и инструментов. Совет Sydius хорош здесь.

  • Если Вы застреваете на других путях, проверьте, что можно записать, загрузиться и выполнить тривиальный модуль. Вероятно, Вы найдете пример этого почти в любой документации относительно предмета.


К разъяснению dave: Между новичком и экспертом может быть жесткое место.

Вы призываете библиотеки в незаконном коде, который Вы не используете в другом месте? Возможно, путь загрузчика испорчен только для того ресурса.

Кроме этого я примерно вне совета.Прошу прощения.


NB: у меня был случай для чтения книги David J. Agans, Отлаживающей в прошлом году. Это не конкретное программное обеспечение, но является хорошим чтением, и полезный, даже если Вы уже - довольно хороший отладчик.

2
ответ дан 6 December 2019 в 15:36
поделиться

То, что это приводит к сбою на dlopen () вызов, кажется немного подозреваемым мне. Существует много вещей, которые могут пойти не так, как надо при попытке открыть общий объект; но ни один из них не должен вызывать отказ seg.

Одним исключением, о котором я могу думать, является проблема в инициализации библиотеки ТАК. На той основе я предложил бы несколько вещей, Вы могли попытаться получить больше информации.

  • Проверьте свой путь к библиотеке и удостоверьтесь, что библиотека, которую Вы пытаетесь загрузить, находится в этом пути. (Отметьте: Так как Вы используете Apache, я думаю, что также необходимо проверить путь к библиотеке на пользователя, при котором работает Apache. (Я думаю, что пользователь - "никто".) Я полагаю, что Вы ищете переменную среды LD_LIBRARY_PATH.) Также отмечают, что, если у Вас есть несколько версий библиотеки, это может быть действительно важно. Удостоверьтесь, что Вы загружаете правильную версию библиотеки.
  • Как общий принцип отладки, попытайтесь упростить проблему. Учитывая, что я знаю мало о модулях Apache, я попытался бы удалить Apache из уравнения: Попытайтесь писать простую программу C, которая делает немного больше, чем dlopen () и возможно последующий dlsym (), затем выходит. Эта программа обеспечивает намного более простую среду, чтобы диагностировать и/или отладить. Если это прогоны программы чисто, то Вы, возможно, должны посмотреть более тесно на то, что отличается, когда программа seg дает сбой. (Что Apache делает по-другому?), С другой стороны, если Ваша программа также seg отказы, можно рассмотреть потенциальную проблему с библиотекой, переключателями компилятора для программы и кода в программе. (Или все вышеупомянутое.)

В то время как я не мог предложить очень много подсказок по отладке общей цели, я надеюсь, что что-то здесь, возможно, было полезно.

2
ответ дан 6 December 2019 в 15:36
поделиться

Я взглянул на valgrind документацию, и по умолчанию она не проверяет дочерние процессы. Меня вообще не удивило бы, если Apache мог бы выполнить Ваш модуль в дочернем потоке. Попробуйте

valgrind --trace-children=yes ....
1
ответ дан 6 December 2019 в 15:36
поделиться

Наш не студенты CS (т.е. электротехника, математика, физические студенты) я рекомендую в лекциях программирования "Практику Программирования" от Kernighan. Это хороший обеспечивает некоторые фундаментальные понятия, который помогает devlopment (как тестирование, и здесь это прибывает: отладка).

Если Вы уже - опытный программист, это является, возможно, слишком основным для Вас. Затем у меня есть просто еще одна из этой Дзэн пословицы для Вас: "Мудрость withouth проникающий опыт бесполезна".

Один ответ я могу только создать резервную копию: Посмотрите снова на отслеживание стека, это - самая соответствующая справка путем отладки (особенно там на границах, где выполнение пересекает различные модули (особенно Ваш и границы lib/ОС), и посмотрите на аргумент функции и проверки, если они нормальны).

1
ответ дан 6 December 2019 в 15:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: