小编Hon*_*gli的帖子

如果程序成功,如何让gdb退出,如果程序崩溃会中断?

我的代码中似乎有一些多线程错误,每30次运行一次测试套件就会崩溃一次.测试套件是非交互式的.我想在gdb中运行我的测试套件,并且如果程序正常退出则正常退出gdb,如果崩溃则中断(并显示调试提示).这样我可以让测试套件反复运行,去拿一杯咖啡,回来,并提供一个很好的调试提示.我怎么能用gdb做到这一点?

gdb

18
推荐指数
3
解决办法
8511
查看次数

如何减少默认的C++内存消耗?

我有一个用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库在使用之前不会增加内存消耗.

我发现的其他事情:

  • 一个简单的hello world C app消耗大约50 KB的内存.
  • 一个简单的hello world C app链接到Curl,但不使用Curl,也消耗大约50 KB的内存.
  • 一个简单的hello world C++应用程序(没有Boost)消耗大约100 KB的内存.
  • 一个简单的hello world C++应用程序包含一些Boost标头,但实际上并没有使用Boost,它消耗大约100 KB的内存.使用'nm'检查可执行文件时没有Boost符号.

我的结论如下:

  1. Gcc抛弃了未使用的Boost符号.
  2. 如果我的应用程序使用Boost,那么C++运行时(可能是动态链接器)中的某些内容会导致它使用大量内存.但是什么?我怎样才能知道这些东西是什么,我能对它们做些什么?

我记得几年前关于C++动态链接器问题的一些KDE讨论.之后的Linux C++动态链接器导致KDE C++应用程序启动时间慢,内存消耗大.据我所知,这些问题已在C++运行时修复.但类似的东西可能是我所看到的过度记忆消耗的原因吗?

来自gcc /动态链接专家的答案非常感谢.

对于那些好奇的人,有问题的服务器是Phusion Passenger的日志记录代理:https://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main.cpp

c++ memory-management elf dynamic-linking low-level

15
推荐指数
2
解决办法
2869
查看次数

如何使RabbitMQ队列进行故障转移?

RabbitMQ默认支持群集,但队列不会被复制并绑定到创建它们的节点.我现在正在寻找使RabbitMQ高度可用的方法,而不是他们记录的DRBD解决方案,因为保留整个服务器似乎浪费资源,除了等待活动服务器停机之外什么都不做.

我正在考虑一个有两个队列的设置.发布消息时,我希望RabbitMQ集群将消息发送到两个队列中的任何一个队列,无论哪个队列正在运行.我知道,如果发布者尝试发布到已关闭的队列并且发布者可以再次尝试使用其他队列,那么发布者将会收到错误,但我想知道这是否可以在群集级别自动完成,这样我就不会不必编写客户端代码来处理它.可以这样做吗?

failover amqp rabbitmq

12
推荐指数
3
解决办法
1万
查看次数

HTML5 AppCache和普通浏览器缓存有什么区别?

我不明白HTML5 AppCache的意义.我们已经有了正常的缓存.如果您第一次访问网站时它已经缓存了所有资产.AppCache提供了什么额外的价值?它只是一个文件列表,以便浏览器知道要下载哪些资产,即使它们现在没有被HTML引用?浏览器是否确保缓存是"全有或全无",即是否确保清单引用的所有内容都被缓存,或者什么都没有?

html5 html5-appcache

12
推荐指数
2
解决办法
5536
查看次数

为什么捕获std :: bad_cast不能在FreeBSD 9上运行?

考虑一下这段代码(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)

c++ freebsd

11
推荐指数
1
解决办法
548
查看次数

如何将Ctrl-C控制字符或终端挂断消息发送到子进程?

我有一个在伪终端中运行的子进程.父进程不以root身份运行,但子进程通过su或sudo运行.因此,无法向子进程发送信号以强制它退出.我想通过以下方法之一强制退出:

  • 模拟Ctrl-C.
  • 模仿终端挂断.

我该怎么做?我已经有一个pty master fd,我尝试过这样的事情:

write(master, &termios.c_cc[VINTR], 1)
Run Code Online (Sandbox Code Playgroud)

但它没有做任何事情.

c posix pty

10
推荐指数
1
解决办法
5668
查看次数

与用户空间上下文切换相比,内核上下文切换有多贵?

根据C10k本文,随着越来越多的客户端连接并创建越来越多的线程,每个连接1个线程的服务器的吞吐量会降低.根据这两个来源,这是因为存在的线程越多,与这些线程完成的实际工作相比,上下文切换花费的时间就越多.在高连接数下,优雅服务器似乎没有受到性能降低的影响.

但是,事务服务器也在客户端之间进行上下文切换,它们只在用户空间中进行.

  • 为什么这些用户空间上下文切换比内核线程上下文切换更快?
  • 内核上下文切换到底有什么用呢?
  • 内核上下文切换到底有多贵?需要多长时间?
  • 内核上下文切换时间是否取决于线程数?

我最感兴趣的是Linux内核如何处理上下文切换,但也欢迎有关其他操作系统的信息.

multithreading kernel

9
推荐指数
1
解决办法
5100
查看次数

是否可以启用链接时优化,同时仅禁用某些功能的严格别名?

我的程序符合严格的别名规则,除了一个地方:一个包含散列函数的编译单元,如MurmurHash3,SpookyHash等.在x86和x86_64上,这些散列函数接受a const char *,转换它们uint32,并处理块中的数据. 4字节.与逐字节处理数据相比,这使得它们更快,但我相信这打破了严格的别名规则.现在,我用-fno-strict-aliasing编译这个编译单元,而我用-fstrict-aliasing编译程序的其余部分.

但我想知道如果启用链接时优化会发生什么.据我所知,GCC和Clang通过将程序源存储到.o文件中来实现链接时优化排序,以便在链接阶段编译器知道整个程序的源代码.那么仍然可以仅为散列函数禁用严格别名吗?或者我现在必须为整个程序禁用严格别名?或者我是否完全误解了事情,而且MurmurHash3/SpookyHash实际上是严格的混叠兼容?

c c++ strict-aliasing

8
推荐指数
3
解决办法
1382
查看次数

EIO 错误代码是什么意思?

我正在维护用户可以在其上部署 Web 应用程序的 Web 服务器软件。Web 应用程序作为单独的进程运行:Web 服务器启动 Web 应用程序进程,将 HTTP 请求转发到 Web 应用程序,并将 Web 应用程序的响应转发回 HTTP 客户端。Web 服务器和 Web 应用程序之间的通信通过套接字进行。

一些用户(= Web 应用程序开发人员)报告说,当他们写入将 Web 应用程序连接到 Web 服务器的套接字时,他们偶尔会遇到神秘的 EIO 错误(至少,他们认为是写入套接字导致了错误)。其他一些人报告说,他们在向 STDERR(重定向到日志文件)写入内容时也会遇到此错误。重新启动 Web 服务器和 Web 应用程序可以在短时间内“修复”此问题。

EIO 是什么意思? 我知道手册上写着“输入/输出错误”,但这个描述非常模糊。什么情况下会发生?它与 ECONNREFUSED/EPIPE/ENOTCONN/etc 有何不同?

sockets

7
推荐指数
1
解决办法
2万
查看次数

如果没有结束调用close()或崩溃,会导致自发EPIPE错误的原因是什么?

我有一个由两个进程组成的应用程序(让我们称之为A和B),通过Unix域套接字相互连接.大多数情况下它工作正常,但有些用户报告以下行为:

  1. A向B发送请求.这有效.A现在开始阅读B的回复.
  2. B向A发送回复.相应的write()调用返回EPIPE错误,结果B关闭()套接字.然而,A并没有关闭()的插座,也没有崩溃.
  3. A的read()调用返回0,表示文件结束.A认为B过早地关闭了连接.

用户还报告了此行为的变化,例如:

  1. A向B发送请求.这部分工作,但在发送整个请求之前A的write()调用返回EPIPE,结果是一个close()套接字.但是B没有关闭()套接字,也没有崩溃.
  2. B读取部分请求然后突然获得EOF.

问题是我无法在本地重现此行为.我试过OS X和Linux.用户使用各种系统,主要是OS X和Linux.

我已经尝试过并考虑过的事情:

  • 双close()错误(在同一文件描述符上调用close()两次):可能不会导致EBADF错误,但我还没有看到它们.
  • 增加最大文件描述符限制.一位用户报告说这对他有用,其余用户报告说没有.

还有什么可能导致这样的行为?我肯定知道A和B都不会过早地关闭()套接字,并且我肯定地知道它们都没有崩溃,因为A和B都能够报告错误.好像内核突然决定出于某种原因从插座拔出插头.

unix sockets posix ipc

6
推荐指数
1
解决办法
1万
查看次数