我的代码中似乎有一些多线程错误,每30次运行一次测试套件就会崩溃一次.测试套件是非交互式的.我想在gdb中运行我的测试套件,并且如果程序正常退出则正常退出gdb,如果崩溃则中断(并显示调试提示).这样我可以让测试套件反复运行,去拿一杯咖啡,回来,并提供一个很好的调试提示.我怎么能用gdb做到这一点?
我有一个用C++编写的服务器应用程序.启动后,它在x86 Linux上使用大约480 KB的内存(Ubuntu 8.04,GCC 4.2.4).我认为480 KB是一个过多的内存:服务器甚至没有做任何事情,没有客户端连接到服务器.(另请参阅下面的评论,其中我解释了为什么我认为480 KB是大量内存.)服务器在初始化期间唯一做的事情就是产生一个或两个线程,设置几个套接字,以及其他简单的东西.非常记忆密集.
请注意,我在谈论实际内存使用情况,而不是VM大小.我通过在空闲笔记本电脑上启动我的服务器的100个实例来测量它,并在启动服务器实例之前和之后用"免费"测量系统内存使用情况.我已经考虑了文件系统缓存和类似的东西.
经过一些测试后,看起来C++运行时中的某些东西会导致我的服务器使用这么多内存,即使服务器本身没有做任何事情.例如,如果我插入
getchar(); return 0;
Run Code Online (Sandbox Code Playgroud)
之后
int main(int argc, char *argv[]) {
Run Code Online (Sandbox Code Playgroud)
然后每个实例的内存使用量仍为410 KB!
我的应用程序仅依赖于Curl和Boost.我有很多C编程经验,我知道C库在使用之前不会增加内存消耗.
我发现的其他事情:
我的结论如下:
我记得几年前关于C++动态链接器问题的一些KDE讨论.之后的Linux C++动态链接器导致KDE C++应用程序启动时间慢,内存消耗大.据我所知,这些问题已在C++运行时修复.但类似的东西可能是我所看到的过度记忆消耗的原因吗?
来自gcc /动态链接专家的答案非常感谢.
对于那些好奇的人,有问题的服务器是Phusion Passenger的日志记录代理:https://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main.cpp
RabbitMQ默认支持群集,但队列不会被复制并绑定到创建它们的节点.我现在正在寻找使RabbitMQ高度可用的方法,而不是他们记录的DRBD解决方案,因为保留整个服务器似乎浪费资源,除了等待活动服务器停机之外什么都不做.
我正在考虑一个有两个队列的设置.发布消息时,我希望RabbitMQ集群将消息发送到两个队列中的任何一个队列,无论哪个队列正在运行.我知道,如果发布者尝试发布到已关闭的队列并且发布者可以再次尝试使用其他队列,那么发布者将会收到错误,但我想知道这是否可以在群集级别自动完成,这样我就不会不必编写客户端代码来处理它.可以这样做吗?
我不明白HTML5 AppCache的意义.我们已经有了正常的缓存.如果您第一次访问网站时它已经缓存了所有资产.AppCache提供了什么额外的价值?它只是一个文件列表,以便浏览器知道要下载哪些资产,即使它们现在没有被HTML引用?浏览器是否确保缓存是"全有或全无",即是否确保清单引用的所有内容都被缓存,或者什么都没有?
考虑一下这段代码(badcast.cpp):
#include <exception>
#include <typeinfo>
#include <stdio.h>
class foo {
public:
virtual ~foo() {}
};
class bar: public foo {
public:
int val;
bar(): val(123) {}
};
static void
cast_test(const foo &f) {
try {
const bar &b = dynamic_cast<const bar &>(f);
printf("%d\n", b.val);
} catch (const std::bad_cast &) {
printf("bad cast\n");
}
}
int main() {
foo f;
cast_test(f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
FreeBSD 9.1:
$ g++ badcast.cpp -o badcast -Wall && ./badcast
terminate called after throwing an instance of …
Run Code Online (Sandbox Code Playgroud) 我有一个在伪终端中运行的子进程.父进程不以root身份运行,但子进程通过su或sudo运行.因此,无法向子进程发送信号以强制它退出.我想通过以下方法之一强制退出:
我该怎么做?我已经有一个pty master fd,我尝试过这样的事情:
write(master, &termios.c_cc[VINTR], 1)
Run Code Online (Sandbox Code Playgroud)
但它没有做任何事情.
我的程序符合严格的别名规则,除了一个地方:一个包含散列函数的编译单元,如MurmurHash3,SpookyHash等.在x86和x86_64上,这些散列函数接受a const char *
,转换它们uint32
,并处理块中的数据. 4字节.与逐字节处理数据相比,这使得它们更快,但我相信这打破了严格的别名规则.现在,我用-fno-strict-aliasing编译这个编译单元,而我用-fstrict-aliasing编译程序的其余部分.
但我想知道如果启用链接时优化会发生什么.据我所知,GCC和Clang通过将程序源存储到.o文件中来实现链接时优化排序,以便在链接阶段编译器知道整个程序的源代码.那么仍然可以仅为散列函数禁用严格别名吗?或者我现在必须为整个程序禁用严格别名?或者我是否完全误解了事情,而且MurmurHash3/SpookyHash实际上是严格的混叠兼容?
我正在维护用户可以在其上部署 Web 应用程序的 Web 服务器软件。Web 应用程序作为单独的进程运行:Web 服务器启动 Web 应用程序进程,将 HTTP 请求转发到 Web 应用程序,并将 Web 应用程序的响应转发回 HTTP 客户端。Web 服务器和 Web 应用程序之间的通信通过套接字进行。
一些用户(= Web 应用程序开发人员)报告说,当他们写入将 Web 应用程序连接到 Web 服务器的套接字时,他们偶尔会遇到神秘的 EIO 错误(至少,他们认为是写入套接字导致了错误)。其他一些人报告说,他们在向 STDERR(重定向到日志文件)写入内容时也会遇到此错误。重新启动 Web 服务器和 Web 应用程序可以在短时间内“修复”此问题。
EIO 是什么意思? 我知道手册上写着“输入/输出错误”,但这个描述非常模糊。什么情况下会发生?它与 ECONNREFUSED/EPIPE/ENOTCONN/etc 有何不同?
我有一个由两个进程组成的应用程序(让我们称之为A和B),通过Unix域套接字相互连接.大多数情况下它工作正常,但有些用户报告以下行为:
用户还报告了此行为的变化,例如:
问题是我无法在本地重现此行为.我试过OS X和Linux.用户使用各种系统,主要是OS X和Linux.
我已经尝试过并考虑过的事情:
还有什么可能导致这样的行为?我肯定知道A和B都不会过早地关闭()套接字,并且我肯定地知道它们都没有崩溃,因为A和B都能够报告错误.好像内核突然决定出于某种原因从插座拔出插头.