小编e27*_*314的帖子

用-g gcc标志编译的程序是否比没有-g编译的同一程序慢?

我正在使用-O3编译程序以获得性能,使用-g编译调试符号(如果发生崩溃,我可以使用核心转储).有一件事困扰我,-g选项会导致性能下降吗?当我查看使用和不使用-g的编译输出时,我看到没有-g的输出比使用-g的编译输出小80%.如果额外的空间用于调试符号,我不关心它(我猜)因为在运行时没有使用这部分.但是如果没有-g的编译输出中的每条指令,我需要在编译输出中用-g做更多4条指令,我当然更愿意停止使用-g选项,即使代价是无法处理核心转储.

如何知道程序内部调试符号部分的大小,一般情况下使用-g进行编译会创建一个比没有-g编译的相同代码运行得慢的程序?

c++ debugging optimization gcc

36
推荐指数
1
解决办法
9135
查看次数

在不知道宏的数量的情况下打印宏值

我的代码包含一个生成的文件(我事先不知道它的内容),只有一个约定我和我的用户就如何创建这个文件达成一致,所以我可以使用它.这个文件看起来像

#define MACRO0 "A"
#define MACRO1 "B"
#define MACRO2 "C"
...
Run Code Online (Sandbox Code Playgroud)

我想打印所有宏值.我目前的代码看起来像

#ifdef MACRO0
std::cout << "MACRO0 " << MACRO0 << std::endl;
#endif
#ifdef MACRO1
std::cout << "MACRO1 " << MACRO1 << std::endl;
#endif
#ifdef MACRO2
std::cout << "MACRO2 " << MACRO2 << std::endl;
#endif
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何迭代生成的文件中的宏,所以我不需要复制我的代码

c++ c-preprocessor

30
推荐指数
1
解决办法
828
查看次数

什么是ld-linux.so.2和linux-gate.so.1?

当我运行时,ldd program我得到表单的输出

    linux-gate.so.1 =>  (0xb77ae000)
    libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000)
    libm.so.6 => /lib/libm.so.6 (0xb7691000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000)
    libc.so.6 => /lib/libc.so.6 (0xb74c2000)
    /lib/ld-linux.so.2 (0xb77af000)
Run Code Online (Sandbox Code Playgroud)

你能解释输出和原因,linux-gate.so.1并以ld-linux.so.2不同于其他条目的方式展示吗?他们的角色是什么?

linux linkage ldd

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

如何在python脚本中使用awscli?

我正在使用aws ec2服务与awscli.现在我想将我在控制台中键入的所有命令放入python脚本中.我看到如果我import awscli在python脚本中编写它工作正常但我不明白如何在脚本中使用它.例如,如何aws ec2 run-instances <arguments>在python脚本中执行命令import awscli?为了说清楚,我不是在寻找像os.system('aws ec2 run-instances <arguments>')我这样的解决方案

import awscli
awscli.ec2_run-instances(<arguments>)
Run Code Online (Sandbox Code Playgroud)

python amazon-ec2 amazon-web-services aws-cli

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

如何在awk中运行grep?

假设我有一个input.txt包含少量列和几行的文件,第一列是键,一个dir文件包含其中一些键的目录.我想找到dir包含这些关键词的文件中的所有行.起初我试图运行命令

cat input.txt | awk '{print $1}' | xargs grep dir
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它认为密钥是我的文件系统上的路径.接下来我尝试了类似的东西

cat input.txt | awk '{system("grep -rn dir $1")}'
Run Code Online (Sandbox Code Playgroud)

但这也没有用,最终我不得不承认即使这样也行不通

cat input.txt | awk '{system("echo $1")}'
Run Code Online (Sandbox Code Playgroud)

在我试图\逃离白色空间和$标志后,我来到这里征求您的意见,任何想法?

当然我可以做点什么

for x in `cat input.txt` ; do grep -rn $x dir ; done
Run Code Online (Sandbox Code Playgroud)

这还不够好,因为它需要两个命令,但我只想要一个.这也说明了为什么xargs不起作用,参数不是最后一个参数

linux bash awk grep

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

是否有gcc的选项丢弃-g标志?

我正在构建一个提供许多makefile的包,每个makefile都有类似的硬编码

CFLAGS = -g -O2 -Wall ...
CXXFLAGS = -g -O2 -Wall ...
Run Code Online (Sandbox Code Playgroud)

我想丢弃-g选项,但我不想编辑所有的makefile(甚至不会自动编辑sed或类似的东西).configure包中附带的脚本没有启用/禁用调试选项,但我可以传递它CFLAGSCXXFLAGS变量,并将它们的值连接到包含选项的变量CFLAGSCXXFLAGS变量-g.

是否有一个选项会-g在指定的情况下丢弃?就像是

gcc -option-im-looking-for -g file.c -o file
Run Code Online (Sandbox Code Playgroud)

将构建file没有调试符号的二进制文件.我不想剥离二进制文件,我希望它被创建剥离.

c++ linux debugging gcc

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

程序可以读取自己的精灵部分吗?

我想使用ld的--build-id选项,以便将构建信息添加到我的二进制文件中.但是,我不确定如何在程序中提供此信息.假设我想编写一个程序,每次发生异常时都会写一个回溯,以及一个解析这些信息的脚本.该脚本读取程序的符号表并搜索在回溯中打印的地址(我被迫使用这样的脚本,因为程序是静态链接的,并且backtrace_symbols不起作用).为了使脚本正常工作,我需要将程序的构建版本与创建回溯的程序的构建版本相匹配.如何从程序本身打印程序的构建版本(位于.note.gnu.build-id elf部分)?

linux elf backtrace

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

gdb 从哪里获取代码行?

当我使用 -g 编译程序并获得核心转储时,我可以使用它gdb来读取可执行文件和核心转储以调试程序在崩溃之前遇到的情况。gdb提供的功能之一是list选项,可以列出使用可执行文件和核心转储编译的源代码。我使用strings -a了可执行文件和核心转储,但我什if至找不到一个或for我确信代码中有很多语句。那么代码是从哪里来的呢?我在一台计算机上编译代码并在另一台计算机上运行它,因此源代码在生成核心转储的计算机上不可用,并且它似乎不在可执行文件或核心转储中。有什么建议?我真的想打印可执行文件和核心转储中的所有源代码,这可能吗?我的意思是不运行gdb,我确定可以编写一个使用 gdb 的脚本并且可以列出整个代码,但我有兴趣自己做,gdb因为我想了解源代码是从哪里获取的已格式化,我想尽可能多地了解它。

c++ linux gcc gdb dwarf

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

gcc"表达式溢出",而等效的等效表达式工作正常

这是我的代码

#include <iostream>
static const unsigned long long int xx = (36 * 36 * 36 * 36) * (36 * 36 * 36 * 36);
static const unsigned long long int y = 36 * 36 * 36 * 36;
static const unsigned long long int yy = y * y;

int main()
{
  std::cout << xx << std::endl;
  std::cout << yy << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是编译输出

# g++ -std=c++11 test.cpp -o test
test.cpp:2:62: warning: integer overflow in …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11

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

使用 yum 安装特定版本的 gcc

我如何要求yum安装特定版本的gcc?当我yum install gcc在 fc17 上运行时,我得到 gcc 4.7.2。我的软件使用这个版本的 gcc 编译得很好。最近我被迫转向fc18,当我运行时yum install gcc我得到gcc 4.8,而我的软件无法用这个版本的gcc编译。因此我被迫手动下载 gcc-4.7.2.fc18.rpm 并手动解决依赖关系。有没有办法要求yum安装特定版本的 gcc?

linux gcc yum

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