Мне поручили разработать сервер чата, который написан на C, потому что разработчик ушел, и я немного знаю C.
Я столкнулся с ошибкой в эти недели и боролся с ней почти 2недель.Я даже не могу сейчас спать, пожалуйста, не удаляйте и, пожалуйста, помогите.
Сервер чата использует цикл обработки событий, каждый раз, когда приходит запрос, он создает структуру command
вместе с некоторыми другими структурами.
Структура command
имеет вид
struct {
struct {
char *message;
int length;
} response;
long count;
int status;
} command;
Иногда указатель message
частично подделан, обычному указателю нравится 0x00003fffxxxxxxxx
, например, двоичный файл:
0000 0000 0000 0000 0110 1111 1111 1111 BBBBBBBBBBBBBBBB (pointerA)
и поврежденный указатель всегда
0000 0000 0000 0000 0000 0000 0000 0001 BBBBBBBBBBBBBBBB (pointerB)
младшие 33 бита указателя всегда одинаковы, а старшие 31 бит всегда установлены на 0.
Так что если message
Аргумент указатель указывает на указатель B, и если я изменяю старшие 31 бит на 0110 1111 1111 1111
, поэтому я получаю указатель B, если я печатаю содержимое pointerB
в gdb, содержимое будет правильным.
Это происходит только при некоторой нагрузке и происходит случайно.Как я могу отладить это?