Несколько человек уже упомянули об изменении времени. Даже если ваш код однопоточный, вы можете вызывать API, который либо запускает потоки от вашего имени, либо реализует какую-то другую форму асинхронного взаимодействия.
Что касается этого утверждения:
Строка трассировки — это часть кода, поэтому она должна идти в сегмент кода.
Это зависит от того, что на самом деле делает ваш код отслеживания. Даже что-то такое простое, как:
write(0, "Hello, World!\n", 14);
Как минимум добавит дополнительное хранилище данных для константной строки, что изменит расположение других константных данных и, возможно, изменит начало других сегментов памяти, что также повлияет на расположение кода и/или кучи. Если это первая ссылка на эту функцию, она добавит запись о перемещении в объектный файл, что может вызвать другие сдвиги в структуре памяти.
Например, более сложный вызов трассировки, который вызывает fwrite или printf, почти наверняка приведет к выделению некоторой памяти для временных буферов и т. д.
Если вы можете воспроизвести ошибку (очевидно, с исходным кодом) при работе в отладчике, то вы сможете, по крайней мере, определить, какой код вызывает segfault. Если из-за отладчика ошибка также не возникает, вы можете рассмотреть возможность включения дампов ядра и отладки на основе дампа.
В противном случае вы можете попробовать запустить код с отладочным пакетом malloc (доступно несколько). Даже если «ошибка» не воспроизводится, вы, вероятно, обнаружите, что таким образом неправильно манипулируете указателем.
Последнее предложение: перекомпилируйте свой код со всеми предупреждениями, включенными в компиляторе, и серьезно рассмотрите все предупреждения, сгенерированные таким образом. Обратите внимание, что в gcc параметр -Wall не включает все предупреждения.
person
Mark Bessey
schedule
18.12.2009