morda

Как изменить содержимое памяти в обход hardware watchpoint'а

Доброго всем времени суток!

Вчера убил около часа на отладку такой ситуации: нужно было найти место, в котором содержимое переменной меняется с нуля на единицу. Отлаживал под linux'ом с помощью gdb.

Как обычно, нашел место в программе, начиная с которого становится известен адрес переменной, добавил в этом месте hardware watchpoint на запись по этому адресу и запустил программу дальше. Через несколько секунд получаю срабатывание другой точки останова -- в функции, которая вызывается только если значение переменной равно единице. Проверяю -- действительно единица.

Collapse )
morda

О стоимости malloc

Расскажу немного о страшной и непредсказуемой стоимости malloc'ов...

В одном из проектов, в котором я участвовал, была задача оптимизировать код, создающий спецэффекты из частиц. Каждый спецэффект состоял из нескольких правил, по которым двигаются частицы, и из самих частиц. В оригинале, каждое правило (и его вспомогательные объекты) создавались на куче каждое отдельно. В результате получалось ~100 malloc'ов на создание спецэффекта, что занимало примерно 30-40 мс...

Collapse )
  • Current Mood
    thoughtful thoughtful
  • Tags
morda

Странное поведение винды

Доброго всем времени суток!

Сижу, работаю, никого не трогаю. Звонок. Заказчик жалуется, что винда его не пускает на сетевые шаринги, если он запускает виндовый сервис нашей разработки. Выслушали, дружно поржали. На разбор к заказчику отправили одного из специалистов.

Collapse )
morda

Инлайн-функция с разными определениями

На интересную подставу наткнулся сегодня. Деструктор std::auto_ptr вдруг отказался вызывать правильный деструктор хранимого объекта в давно работающем и не изменявшемся коде. Вот пример кода, который демонстрирует проблему.
Этот код может вывести "Hi!"... а может и не вывести, как повезет.
Collapse )
morda

Идентификаторы ребер неориентированного графа

Задача: сделать ключ, по которому можно будет найти ребро неориентированного графа. Т. е. если вершина графа обозначена целочисленным идентификатором, то ребро такого графа можно обозначить как (a,b), причем (a,b) и (b,a) — это одно и то же ребро.
Хочется сделать так, чтобы не приходилось сортировать идентификаторы вершин a и b перед занесением их в ключ. Иными словами, если ключ у нас, это std::pair<int,int>, то нужно избежать условного перехода при конструировании этой пары. Как оказалось, решение есть: вместо a и b заносим в пару a+b и abs(a-b). Эти два числа однозначно идентифицируют наше ребро (a,b).
morda

Маленький отладочный трюк

Часто бывает, что на момент проявления ошибки установить ее причину уже невозможно: код, который содержит ошибку уже выполнен. Особенно неприятно, когда нет четких steps-to-reproduce и трудно определить, куда и с каким условием поставить точку останова перед ошибочным кодом. В такой момент мечтаешь об отладчике с поддержкой time travel.
Collapse )