c语言 冻结窗口,C语言 冻结__write_nocancel

所以我有一个非常重要的程序,它偶尔会冻结.

该程序使用Qt,开放场景图和谷歌日志记录.这种冻结发生在谷歌日志记录中.该程序本身正在打印大量的调试信息.我能够通过gdb-server连接到程序,这是堆栈跟踪:

#0 0x000000397ac0e030 in __write_nocancel () at ../sysdeps/unix/syscall-template.S:82

#1 0x00007f5eecb74aeb in google::LogMessage::SendToLog() () from /lib64/libglog.so.0

#2 0x00007f5eecb71fc7 in google::LogMessage::Flush() () from /lib64/libglog.so.0

#3 0x00007f5eecb721a9 in google::LogMessage::~LogMessage() () from /lib64/libglog.so.0

#4 0x00000000004874a6 in LSDB::process (this=0x242d918, lsp=0x25f9200, circuit=0x24c7af0) at ../src/model/trill/LSDB.cpp:481

#5 0x00000000004a0f6f in Circuit::rx (this=0x24c7af0, eth=0x246fdf0) at ../src/model/trill/Circuit.cpp:355

#6 0x000000000045c950 in Circuit::qt_static_metacall (_o=0x24c7af0, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fffaade95a0)

at ../src/model/trill/Circuit.moc.cpp:55

#7 0x000000398798cb9f in QMetaObject::activate (sender=0x2470140, m=, local_signal_index=, argv=0x7fffaade95a0)

at kernel/qobject.cpp:3547

#8 0x0000000000459610 in FramePublisher::subscription (this=0x2470140, _t1=0x246fdf0) at ../src/model/system/FramePublisher.moc.cpp:98

#9 0x000000000047c0d6 in FramePublisher::rx (this=0x2470140, frame=0x246fdf0) at ../src/model/system/FramePublisher.hpp:21

#10 0x000000000047bedb in EthernetPort::rx (this=0x246d7a0, frame=0x25a4180) at ../src/model/system/EthernetPort.cpp:81

#11 0x000000000045a208 in EthernetPort::qt_static_metacall (_o=0x246d7a0, _c=QMetaObject::InvokeMetaMethod, _id=1, _a=0x7fffaade9810)

at ../src/model/system/EthernetPort.moc.cpp:51

#12 0x000000398798cb9f in QMetaObject::activate (sender=0x246d7a0, m=, local_signal_index=, argv=0x7fffaade9810)

at kernel/qobject.cpp:3547

#13 0x0000000000459ddc in Port::rx (this=0x246d7a0, _t1=0x25a4180) at ../src/model/system/Port.moc.cpp:110

#14 0x00000000004803a6 in Port::inject (this=0x246d7a0, frame=0x25a4180) at ../src/model/system/Port.cpp:25

请注意冻结本身发生在__write_nocancel中.只有一个线程运行…

(gdb) info threads Id Target Id Frame

* 1 Thread 21507 0x000000397ac0e030 in __write_nocancel () at ../sysdeps/unix/syscall-template.S:82

关于什么导致冻结的任何想法?让我知道其他信息可能会有所帮助.

你说输出正在写入stderr.如果没有通过单独的进程不断读取stderr,则I / O缓冲区可能已满,因此它在写入更多内容之前等待stderr被读取.

如果进程A写入stderr并且进程B通常从stderr读取但当前正在等待进程A,则可能导致死锁.在你的情况下,如果写入stderr太大,它只会导致死锁,因为较小的写入会立即成功并释放进程A,从而释放进程B从stderr读取.

这是我的一些猜测,但总的来说我会假设你的问题是你正在等待写入一个完整的缓冲区.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值