神奇的咒语
LD_PRELOAD=/lib/libSegFault.so someapp
Run Code Online (Sandbox Code Playgroud)
someapp与libSegFault.so一起运行,提供有关SIGSEGV的回溯信息,如许多 不同的 地方所述.
除了使用类似signal(7)方法来SIGABRT调用SIGSEGV处理程序之外,还有一些方法可以让libSegFault为assert(3)失败提供回溯信息吗?
我有一个小的C程序来计算哈希值(哈希表).我希望代码看起来很干净,但有一些与它无关的东西让我烦恼.
我可以在大约0.2-0.3秒内轻松生成大约一百万个哈希值(以/ usr/bin/time为基准).但是,当我在forf循环中使用printf()时,程序会减慢到大约5秒钟.
我期待着有趣而详细的回复.谢谢.
PS:这是一个编译器构造工具集,所以不要害羞进入细节.虽然这与问题本身无关,但我只想指出细节让我感兴趣.
附录
我正在寻找更多解决方案和解释的程序方法.确实,管道工作起了作用,但我无法控制"用户"的作用.
当然,我现在正在进行测试,"普通用户"不会这样做.但这并没有改变一个简单的printf()减慢一个进程的事实,这是我试图找到一个最佳的编程解决方案的问题.
附录 - 惊人的结果
参考时间用于TTY内的普通printf()调用,大约需要4分钟20秒.
在/ dev/pts(例如Konsole)下进行测试可将输出速度提高到约5秒.
在我的测试代码中使用setbuffer()大小为16384时需要大约相同的时间,对于8192几乎相同:大约6秒.
setbuffer()在使用时显然没有效果:它需要相同的时间(在TTY上大约4分钟,在PTS上大约5秒).
令人惊讶的是,如果我在TTY1上开始测试然后切换到另一个TTY,它确实需要与PTS相同:大约5秒.
结论:内核做了一些与可访问性和用户友好性有关的事情.呵呵!
通常情况下,无论你是在活动时盯着TTY还是切换到另一个TTY,它都应该同样慢.
课程:运行输出密集型程序时,切换到另一个TTY!
我正在尝试为大型框架实现回溯功能,该框架用于不同的平台和操作系统.在其中一些中,它与glibc相关联,而在另一个中,使用了不同的东西(例如uclibc).backtrace()函数仅存在于前者中.
有没有办法判断glibc是否被使用?任何#define?我无法在glibc手册中找到答案.我知道在编译期间我不能有链接时间信息,但我想包含文件必须有所不同.至少必须在某处声明回溯.我想检查它而不必强制将显式标志传递给编译器.
特别:
以某种方式确保所有版本的glibc 2.x都是二进制兼容的吗?
如果没有,我如何在我的系统上运行二进制(游戏),该二进制(游戏)已针对不同的版本编译?我可以在其他文件夹中安装glibc吗?
我的具体问题是glibc 2.14(我拥有的)和2.15(游戏想要的)之间的兼容性.
我可能也会得到glibc 2.13的版本,但我不确定它是否会在2.14上运行.
当我尝试在 conda 环境中运行 Python 脚本时,出现以下导入错误
(squad) azada@scholar-fe00:~/Desktop/Toy-Problem-Team-2 $ python3 train.py
Traceback (most recent call last):
File "train.py", line 21, in <module>
from tensorboardX import SummaryWriter
File "/home/azada/miniconda3/envs/squad/lib/python3.6/site-packages/tensorboardX/__init__.py", line 5, in <module>
from .torchvis import TorchVis
File "/home/azada/miniconda3/envs/squad/lib/python3.6/site-packages/tensorboardX/torchvis.py", line 11, in <module>
from .writer import SummaryWriter
File "/home/azada/miniconda3/envs/squad/lib/python3.6/site-packages/tensorboardX/writer.py", line 15, in <module>
from .event_file_writer import EventFileWriter
File "/home/azada/miniconda3/envs/squad/lib/python3.6/site-packages/tensorboardX/event_file_writer.py", line 28, in <module>
from .proto import event_pb2
File "/home/azada/miniconda3/envs/squad/lib/python3.6/site-packages/tensorboardX/proto/event_pb2.py", line 7, in <module>
from google.protobuf import descriptor as _descriptor
File "/home/azada/miniconda3/envs/squad/lib/python3.6/site-packages/google/protobuf/descriptor.py", line …Run Code Online (Sandbox Code Playgroud) 我想使用CPU_SET,这是一个glibc linux特定的宏,应该在sched.h man手册页中清楚地说明_GNU_SOURCE必须定义以便定义宏.但是,查看标题CPU_SET仅在__USE_GNU定义时定义(有#ifdef保护).几年前我似乎记得那_GNU_SOURCE是必要的.
问题:
1)显然,联机帮助页已关闭.如何通知维护者该联机帮助页不正确?
2)什么时候从过渡_GNU_SOURCE到__USE_GNU发生(无论是在版本或时间方面)
3)是否存在较新版本的glibc仍在使用的情况_GNU_SOURCE?或者我可以安全地假设定义__USE_GNU是足够的吗?
我正在尝试制作尽可能便携的可执行文件.删除一些依赖项后,我在另一个系统上运行二进制文件时遇到以下情况:
/lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by foob)
/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by foob)
Run Code Online (Sandbox Code Playgroud)
我更喜欢我的二进制文件不要求用户升级他们的libc版本,所以我也想删除这个依赖项.
生成上述二进制文件的链接器标志已包含在内-static-libgcc -static-libstdc++.为什么二进制文件仍然需要共享的libc.so.6?
我也尝试添加-static标志,但是当我尝试运行该二进制文件时,结果非常奇怪:
$ ls -l foob
-rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob
$ ./foob
bash: ./foob: No such file or directory
Run Code Online (Sandbox Code Playgroud)
该怎么办?
编辑:
$ file foob
foob: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), …Run Code Online (Sandbox Code Playgroud) 为什么libc_nonshared.a存在?它的目的是什么?我一直无法在网上找到关于它存在的好答案。
据我可以告诉它提供了某些符号(stat,lstat,fstat,atexit,等等)。如果有人在他们的代码中使用这些函数之一,它将被链接到这个存档中的最终可执行文件。这些函数是 POSIX 标准的一部分并且非常常见,所以我不明白为什么它们不会分别放在 shared 或 staticlibc.so.6或 中libc.a。
我有一个关于libstdc ++的问题.所以.
我安装了新版本的gcc并尝试编译c ++代码.编译工作,但当我尝试执行二进制文件(m5.opt是它的名字)时,我遇到以下错误:build/ALPHA_SE/m5.opt:/usr/lib64/libstdc++.so.6:version`GLIBCXX_3找不到.4.9'(build/ALPHA_SE/m5.opt要求).
我需要替换libstdc ++.所以?如果是这样,我在哪里可以下载我想要的版本?在GCC网站上,他们说libstdc ++现在是gcc的一部分.
我希望有人可以帮助我!我现在只在Linux上工作了4个月,所以对我来说一切都很新.
马克斯
海湾合作委员会:
我之前有过gcc 4.1.2,但是我下载了gcc 4.2.4.从untarred gcc-directory我执行"./configure"; "使"; "sudo make install".当我尝试使用gcc或g ++进行编译时,它的默认版本仍为4.1.2.为了解决这个问题,我更换了一些链接:
mv/usr/bin/gcc/usr/bin/gcc_bak
ln -s/usr/local/bin/gcc gcc
mv/usr/bin/g ++/usr/bin/g ++ _ bak
ln -s/usr/local/bin/g ++ g ++
GLIBC(++) - libstdc ++:
/
usr/lib64/libstdc + +.so.6
- > libstdc ++.so.6.0.8
/usr/local/lib/libstdc++.so - > libstdc ++.so.6.0.9
/ lib/libc.so.6 - > libc-2.5.so - > libc-2.5.so
Linux版本:
uname -a给出:Linux madmax 2.6.18-128.4.1.el5#1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
我的套接字似乎有问题.下面,您将看到一些分叉服务器和客户端的代码.服务器打开TCP套接字,客户端连接到它,然后关闭它.睡眠用于协调时间.在客户端关闭()之后,服务器尝试将write()写入其自己的TCP连接端.根据write(2)手册页,这应该给我一个SIGPIPE和一个EPIPE错误.但是,我没有看到这一点.从服务器的角度来看,写入本地已关闭的套接字成功,如果没有EPIPE,我无法看到服务器应该如何检测到客户端已关闭套接字.
在关闭其结束的客户端和尝试写入的服务器之间的间隙中,对netstat的调用将显示连接处于CLOSE_WAIT/FIN_WAIT2状态,因此服务器端应该绝对能够拒绝写入.
作为参考,我在Debian Squeeze上,uname -r是2.6.39-bpo.2-amd64.
这里发生了什么?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/tcp.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <netdb.h>
#define SERVER_ADDRESS "127.0.0.7"
#define SERVER_PORT 4777
#define myfail_if( test, msg ) do { if((test)){ fprintf(stderr, msg "\n"); exit(1); } } while (0)
#define myfail_unless( test, msg ) myfail_if( !(test), msg )
int connect_client( char *addr, int actual_port )
{
int client_fd;
struct addrinfo hint;
struct addrinfo …Run Code Online (Sandbox Code Playgroud) glibc ×10
c ×6
c++ ×4
gcc ×2
linux ×2
anaconda ×1
backtrace ×1
gnu ×1
installation ×1
libc ×1
libstdc++ ×1
linux-kernel ×1
performance ×1
python ×1
sigabrt ×1
sockets ×1
stack-trace ×1
stdout ×1
tcp ×1
tensorflow ×1