小编sda*_*aau的帖子

GCC/objdump:生成可编译/可构建的程序集(穿插在C/C++中)源代码?

这接近于使用GCC生成可读组件?,但我的上下文是avr-gcc(并相应地avr-objdump)Atmel(虽然,我想它将适用于GCC董事会).

问题是,我有一个多个.c和.cpp文件的项目; 最终被编译成可执行文件,其名称与'master'.cpp文件相同.在这个过程中,我可以通过两种方式获得汇编列表:

  • 我可以使用开关指示gcc发出汇编列表源(参见Linux汇编和反汇编和简介)-S; 在这种情况下,我得到一个文件,内容如下:
    ...
    loop:
      push r14
      push r15
      push r16
      push r17
      push r28
      push r29
    /* prologue: function /
    / frame size = 0 */
      ldi r24,lo8(13)
      ldi r22,lo8(1)
      call digitalWrite
      rjmp .L2
    .L3:
      ldi r24,lo8(MyObj)
      ldi r25,hi8(MyObj)
      call _ZN16MYOBJ7connectEv
    .L2:
      ldi r24,lo8(MyObj)
      ldi r25,hi8(MyObj)
      call _ZN16MYOBJ11isConnectedEv
    ...
    

(还没有尝试过;但我想这段代码是可编译的/可构建的....)

  • 我可以检查最终的可执行文件,并指示objdump使用该-S开关发出汇编列表源; 在这种情况下,我得到一个文件,内容如下:
    ...
    0000066a <init>:
    void init()
    { …

c assembly gcc objdump

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

使用eval初始化perl变量

我猜这对于那些了解Perl的人来说应该是显而易见的,但是我根本就没有得到它......我也猜测它与Perl范围内描述的问题有关«黑暗 - 但我不能在我的案例中应用任何问题.

无论如何,这是代码:

#!/usr/bin/env perl
# call with:
# ./test.pl

use strict;

my $tvars = "my \$varA = 1;
my \$varB = 2;
my \$varC = 3;
";

my @lines = split /\n/, $tvars;
foreach my $line (@lines) {
  print "$line\n";
  eval $line; warn $@ if $@;
}

#~ print "$varA\n"; # Global symbol "$varA" requires explicit package name at ./test.pl line 18.
#~ print "$varB\n"; # Global symbol "$varB" requires explicit package name at ./test.pl …
Run Code Online (Sandbox Code Playgroud)

variables perl scope eval

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

sed:同步替换,打印出更改的行?

说我有这个文件:

cat > test.txt <<EOF
line one word
line two word
line three word
line one two word
EOF
Run Code Online (Sandbox Code Playgroud)

让我们说我想用'TWO'替换所有单词'two',在文件中就地内联 .test.txt

现在,我所做的通常是构建一个"预览"(-n不打印行,然后使用/p- 仅打印匹配的行):

$ sed -n 's/two/TWO/gp' test.txt 
line TWO word
line one TWO word
Run Code Online (Sandbox Code Playgroud)

...然后我通常执行实际的就地替换(有-i和没有/p):

$ sed -i 's/two/TWO/g' test.txt
$ cat test.txt 
line one word
line TWO word
line three word
line one TWO word
Run Code Online (Sandbox Code Playgroud)

有没有办法sed在一个文件中就地更改行,从一个命令行打印更改的行到stdout?

shell sed

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

什么是PostScript词典,以及如何访问它们(通过Ghostscript)?

我通常将其ghostscript视为命令行工具; 然而,我从不停止对那里存在的大量设置和选项感到惊讶 - 这是因为这ghostscript是一个完整的PostScript语言解释器(我经常忘记).

例如,在查询Ghostscript中输出设备的默认选项/设置(例如'pdfwrite'或'tiffg4') ; 一个人学习如何检索给定输出设备的默认选项.但是,我想知道的是 - 这些选项是否与所谓的PostScript词典相关?

或者,换句话说 - 什么是PostScript词典; 什么设施ghostscript有,查询(并可能)修改这些数据?

stack dictionary postscript ghostscript

7
推荐指数
3
解决办法
6406
查看次数

在 MINGW64 上点赞?

我试图在 Windows 10 机器上通过 MSYS2 shell 安装 Jupyter(根据https://jupyter.org/install,“使用 pip 安装 Jupyter”) - 并且进程崩溃了;然后我发现了这个:

jupyter notebook 无法启动 · Issue #1540 · msys2/MSYS2-packages · GitHub

您需要从 mingw64 shell 启动 jupyter notebook,而不是从 msys2 shell。对我来说,一个简单的 jupyter 笔记本可以按预期工作。

好的,所以我想尝试 MINGW64 shell。

请注意,在 MSYS2 外壳中:

user@DESKTOP-PC MSYS /c/
$ python3 -m pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/5c/e0/be401c003291b56efc55aeba6a80ab790d3d4cece2778288d65323009420/pip-19.1.1-py2.py3-none-any.whl (1.4MB)
     |????????????????????????????????| 1.4MB 2.3MB/s
Installing collected packages: pip
  Found existing installation: pip 19.1
    Uninstalling pip-19.1:
      Successfully uninstalled pip-19.1
Successfully installed pip-19.1.1
Run Code Online (Sandbox Code Playgroud)

因此,pip 在 MSYS2 shell …

python pip mingw-w64 windows-10

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

Linux:上传未完成的文件 - 带文件大小检查(scp/rsync)

我通常最终会遇到以下情况:例如,我有一个来自相机的650 MB MPEG-2 .avi视频文件.然后,我使用ffmpeg2theora将其转换为Theora .ogv视频文件,比如说大小为150 MB.最后,我想将此.ogv文件上传到ssh服务器.

比方说,ffmpeg2theora我的电脑上的编码过程大约需要15分钟.另一方面,上传速度约为60 KB/s,大约需要45分钟(150MB .ogv).所以:如果我先编码,并等待编码过程完成 - 然后上传,则需要大约

15 min + 45 min = 1 hr
Run Code Online (Sandbox Code Playgroud)

完成操作.

所以,我认为如果我能以某种方式开始上传,与编码操作并行,那会更好; 然后,原则上-作为上传过程较慢(在传输的字节/秒计),比编码一个(在生成的字节/秒计) -上载过程将总是编码一个"后面线索",所以整个操作(enc + upl)将在45分钟内完成(也就是说,只需上传过程的时间+/-几分钟,具体取决于线路上的实际上传速度情况).

我的第一个想法是管道输出ffmpeg2theoratee(以便保留.ogv的本地副本),然后,将输出进一步管道输入ssh- 如下所示:

./ffmpeg2theora-0.27.linux32.bin -v 8 -a 3 -o /dev/stdout MVI.AVI | tee MVI.ogv | ssh user@ssh.server.com "cat > ~/myvids/MVI.ogv"
Run Code Online (Sandbox Code Playgroud)

虽然这个命令确实具有功能 - 人们可以很容易地在终端的运行日志中看到ffmpeg2theora,在这种情况下,ffmpeg2theora计算预测的完成时间为1小时; 也就是说,对于enc + upl的较小完成时间似乎没有任何好处.(虽然这可能是由于网络拥塞,而且我当时的网络速度降低了 - 在我看来,它ffmpeg2theora …

linux upload rsync scp filesize

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

Linux:控制`ld`搜索.o目标文件的位置?

好吧,情况就是这样:我正在尝试使用一些较旧的软件:在Ubuntu Lucid上工作正常,在Natty上失败.

所以,我strace喋喋不休,事实证明这个软件调用ld,并ld最终失败:

.../ld: crt1.o: No such file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

...是的,旧的crti.o文件丢失错误:)但是,我想用更一般的术语提问...

问题是,这是"独立"(较旧)ld,当我跑步时.../ld -verbose | less,我得到:

...
SEARCH_DIR("/usr/local/lib"); 
SEARCH_DIR("/lib"); 
SEARCH_DIR("/usr/lib");
...
Run Code Online (Sandbox Code Playgroud)

现在,问题在于:

  • 在Lucid,crt1.o是在/usr/lib/crt1.o
  • 在纳蒂,crt1.o是在/usr/lib/i386-linux-gnu/crt1.o

...所以,毫无疑问,为什么crt1.o无法找到,我想.看来,我所要做的,就是告诉ld寻找crt1.o/usr/lib/i386-linux-gnu,但我怎么做呢?

我以为我可以使用该-L选项,但是man ld说:

to link a file "hello.o":

    ld -o <output> /lib/crt0.o hello.o -lc

  This tells ld to produce a file called output as …
Run Code Online (Sandbox Code Playgroud)

linux search path object ld

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

JavaScript 中的 setTimeout 是否接受真实(浮点)延迟时间_

我刚刚查看了JavaScript Timing Events,其中显示“第二个参数指示从现在开始多少毫秒后您要执行第一个参数。

现在,我知道在 JavaScript 中,浮点和整数都是 类型Number,因此从语法上讲,我可以输入浮点值,例如 ' setTimeout("javascript statement",4.5);' - 但是,JavaScript 是否会尝试在那里创建 4.5 毫秒的延迟?或者它会自动截断为整数并继续?

预先感谢您的任何答复,
干杯!

javascript timing

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

观察Linux内核中的变量(内存地址)更改,并在更改时打印堆栈跟踪?

我想以某种方式"监视"Linux内核中的变量(或内存地址)(确切地说是内核模块/驱动程序); 并找出改变它的原因 - 基本上,当变量改变时打印出堆栈跟踪.

例如,在本答案testjiffy-hr.c末尾列出的内核模块中,我想在每次变量更改时打印出堆栈跟踪; 希望堆栈跟踪然后会包含提及,这确实是改变该变量的函数.runcounttestjiffy_timer_function

现在,我知道我可以使用kgdb连接到运行在虚拟机中的调试Linux内核,甚至设置断点(所以希望也是观察点) - 但问题是我实际上想要调试ALSA驱动程序,特别是回放dma_area缓冲区(我得到一些意想不到的数据) - 这对时间非常敏感; 并且运行调试内核本身会弄乱时间(更不用说在虚拟机中运行它)了.

这里更大的问题是回放dma_area指针仅在回放操作期间(或者换句话说,在_start_stop处理程序之间)存在 - 所以我必须dma_area在每次_start回调时记录地址,然后以某种方式"安排"它为"在播放操作期间观看.

所以我希望有一种方法可以直接在驱动程序代码中执行这样的操作 - 例如,在此_start回调中添加一些记录dma_area指针的代码,并将其用作命令的参数,该命令启动"监视"更改; 从相应的回调函数打印堆栈跟踪.(我知道这也会影响时间,但我希望它能够"轻松",不会过多地影响"实时"驱动程序操作).

所以我的问题是:在Linux内核中进行调试的这种技术是否存在?

如果不是:是否可以设置硬件(或软件)中断,该中断会对特定内存地址的更改做出反应?然后,我可以设置这样的中断处理程序,可以打印出堆栈跟踪吗?(虽然,我认为整个上下文在IRQ处理程序运行时会发生变化,因此可能会出现堆栈跟踪错误)?

如果没有:是否还有其他技术,这将允许我打印进程的堆栈跟踪,该跟踪更改存储在内核中给定内存位置的值(希望在实时的非调试内核中)?

debugging linux-kernel

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

将errno打印为助记符?

我已经看到了从符号errno到String-Stack Overflow的问题,所以即使该问题bash相关,我也已经知道这并不是一件小事。但是只是为了确认:

是否有一个C API函数,该函数strerror()会接受数字errno作为参数-但会打印助记符(例如EINVAL)而不是错误描述字符串(例如“无效参数”)?

例如,我想

printf("Number: %d (%s): '%s'\n", 22, strerror_mnemonic(22), strerror(22) );
Run Code Online (Sandbox Code Playgroud)

... 打印:

Number: 22 (EINVAL): 'Invalid argument'
Run Code Online (Sandbox Code Playgroud)

...哪里strerror_mnemonic是我要寻找的C函数的伪代码。

c linux

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