我遇到了由用无效值覆盖指针引起的错误。我无法使用 valgrind(在默认模式下)或使用 GDB 找到错误,因为它们只将我指向无效指针,而不是什么将指针覆盖到不正确的值。
它始终是同一个变量,但是,我没有明确地将其设置为错误值。程序中的其他一些行必须访问超出其边界的内存,但碰巧它碰巧命中了该指针的存储空间。
我不确定我应该使用什么调试工具/选项来解决这个错误。
崩溃示例:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff6ffc700 (LWP 2425)]
0x00000000004058b2 in writeToConn (conn=0x7ffff0004f40) at streamHandling.c:115
115 ssize_t result = send(conn->fd, conn->head->data->string + position, conn->head->data->size - position, 0);
(gdb) print conn
$1 = (struct connection *) 0x7ffff0004f40
(gdb) print conn->head->data
$2 = (struct dbstring *) 0x35
不幸的是,我不能简单地观察变量conn->head->data
,因为我有大约 5,000 个 conn 结构。
这段代码大部分时间都可以工作,但是如果在中等负载下运行,它会在几秒钟后崩溃。