1

我遇到了由用无效值覆盖指针引起的错误。我无法使用 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 结构。

这段代码大部分时间都可以工作,但是如果在中等负载下运行,它会在几秒钟后崩溃。

4

2 回答 2

2

gdb触发断点时,您可以使用Break Commands自动执行命令。

您可以设置一个中断命令以在struct connection分配 a 时运行,并让它在感兴趣的字段上添加一个观察点。

于 2012-10-14T08:05:32.297 回答
0

堆栈回溯有帮助吗?这是一个告诉如何做到这一点的页面。

如何在 C 中获取堆栈跟踪?

于 2012-10-14T07:25:03.720 回答