小编Jay*_*rod的帖子

排出Intel Core 2 Duo的指令流水线?

我正在为C中的一些非常短的操作编写一些微基准测试代码.例如,我测量的一件事是根据传递的参数数量调用空函数需要多少个周期.

目前,我在每次操作之前和之后使用RDTSC指令进行计时,以获得CPU的循环计数.但是,我担心在第一个RDTSC之前发出的指令可能会减慢我正在测量的实际指令.我还担心在第二个RDTSC发布之前可能无法完成整个操作.

有没有人知道x86指令强制所有正在进行的指令在发出新指令之前提交?我被告知CPUID可能会这样做,但我一直无法找到任何说明的文档.

c benchmarking x86 assembly microbenchmark

8
推荐指数
1
解决办法
1795
查看次数

没有dlsym的Linux中的函数插入

我目前工作的一个项目,我需要跟踪的几个系统调用和低级别的功能,如使用mmap,brk,sbrk.到目前为止,我一直在使用函数插入来执行此操作:我编写了一个与我正在替换的函数同名的包装函数(mmap例如),并通过设置LD_PRELOAD环境变量将其加载到程序中.我通过我加载的指针调用实际函数dlsym.

不幸的是,我想要包装的函数之一在sbrk内部使用dlsym,因此当我尝试加载符号时程序崩溃.sbrk在Linux中不是系统调用,所以我不能简单地使用syscall它来间接调用它.

所以我的问题是,如何在不使用相同名称的包装函数的情况下调用库函数dlsym?是否有任何编译器技巧(使用gcc)让我参考原始函数?

c linux function-interposition dlsym

8
推荐指数
1
解决办法
4226
查看次数

为什么Scala不能在此示例中推断出类型参数?

假设我有两个类,Input并且Output,其被设计为连接到彼此.Output生成某种类型的值,并使用Input它们.

class Input[T] {
  var output: Option[Output[_ <: T]] = None
}
class Output[T] {
  var input: Option[Input[_ >: T]] = None
}
Run Code Online (Sandbox Code Playgroud)

只要类型参数是类型参数的超类型,Input并且Output对和不对同一类值进行操作就没关系.请注意,两个类中的type参数都是不变的; 在真实版本中,它用于共同和逆变位置.InputOutput

我在connect其他地方有一个方法,它在Input/ Outputpair 之间建立一个链接:

def connect[T](output: Output[T], input: Input[_ >: T]) = {
  output.input = Some(input)
  input.output = Some(output)
}
Run Code Online (Sandbox Code Playgroud)

如果我按如下方式调用此方法,则会出现类型错误:

val out = new Output[String]
val in = new Input[AnyRef]
connect(out, in)
Run Code Online (Sandbox Code Playgroud)

错误是:

test.scala:17: error: type …
Run Code Online (Sandbox Code Playgroud)

generics types scala type-inference

8
推荐指数
1
解决办法
1160
查看次数

Emacs/GDB:始终使用gdb-many-windows在特定窗口中显示源代码

我在Emacs 24中使用GDB gdb-many-windows设置为t,通常在自己的框架中.我喜欢有一个单独的编辑框架.它看起来像这样(为我粗略的ASCII图表道歉):

+-------------+-------------+
| gdb         | locals      |
+-------------+-------------+
| source      | I/O         |
|             |             |
+-------------+-------------+
| stack       | breakpoints |
+-------------+-------------+
Run Code Online (Sandbox Code Playgroud)

除了一个大问题之外,这很有效.每当gdb需要显示不同的源缓冲区时,例如,在上/下/步之后,它并不总是在"源"窗口中显示它.例如,如果我在不同帧的窗口中打开相同的缓冲区,它将提升该帧,同时将键盘焦点保持在gdb帧中.当帧相互覆盖时,这在单显示器设置上非常烦人.

我希望gdb始终使用gdb-many-windows设置中的源窗口来显示源,无论是否在其他地方显示相同的源缓冲区.我怎样才能做到这一点?


编辑:更详细的重现说明.我正在使用Emacs 24.2.1和GDB 7.5-ubuntu.我在Ubuntu 10.04和Linux Mint Nadia与Cinnamon上看到过这个问题.

  • 评估此表达式: (setq gdb-many-windows t)
  • 使用至少两个文件编译C程序.

例如:

// foo.c
void bar(int);
void foo(int c) {
  if (c > 0)
    bar(c - 1);
}
int main(void) {
  foo(100);
  return 0;
}

// bar.c
void foo(int c);
void bar(int c) {
  if (c > …
Run Code Online (Sandbox Code Playgroud)

emacs gdb elisp gud

8
推荐指数
1
解决办法
2295
查看次数

使用OpenGL和Cocoa绘制文本的最佳方法是什么?

有谁知道在Cocoa NSOpenGLView中绘制任意文本的简单方法?我有几个限制.

  • 屏幕上的文本可能会逐帧更改(例如,角落中的帧速率显示)
  • 我希望能够选择任何大小的系统上安装的任何字体

opengl cocoa

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

操纵可变参数的标准方法?

这是一个奇怪的问题,但是va_list在将它传递给另一个函数之前是否有一种标准方法来操作a的内容?例如,假设我有两个函数,sum并且vsum:

int vsum(int n, va_list ap) {
    int total = 0;
    for (int i = 0; i < n; ++i) {
        total += va_arg(n, int);
    return total;
}

int sum(int n, ...) {
    va_list ap;
    va_start(ap, n);
    int total = vsum(n, ap);
    va_end(ap);
    return total;
}
Run Code Online (Sandbox Code Playgroud)

如果我调用sumas sum(4, 1, 2, 3, 4),我希望得到结果10.现在让我们假设不是vsum直接sum调用,而是调用一个中间函数,vsum_stub它执行以下操作:

int vsum_stub(int n, va_list ap) {
    va_list temp_ap;
    va_copy(temp_ap, ap);
    for (int i …
Run Code Online (Sandbox Code Playgroud)

c variadic-functions

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

在Linux程序中跟踪活动使用的内存

我想跟踪各种程序在特定状态下触摸的内存量.例如,假设我有一个图形程序.当它被最小化时,它可能会使用更少的内存,因为它不会重绘窗口,这需要读取图像和字体并执行大量的库函数.这些对象仍可在内存中访问,但实际上并未使用它们.

类似top的工具是有限使用的,因为它们只是告诉多少内存映射到程序的地址空间,以及它有多少驻留在物理RAM中.同样,泄漏检测器只会告诉内存何时无法访问,而不是仅仅是因为它没有被使用.

是否存在可以以这种方式跟踪活动使用/未使用的内存的现有工具?如果可能的话,我不仅要跟踪堆上的使用情况,还要跟踪存储程序/库代码的内存.


编辑:我想澄清一下:我想知道程序实际读取,写入或执行某个点之后的内存,即一旦达到某个状态.虽然地址空间中的页数和常驻页数是重要的测量值,但这不是我想要的.

我现在正在追求三种方法:

  1. 我编写了一个库,清除了使用`mprotect`从/ proc/self/maps读取的所有内存区域(堆栈及其自己的代码除外)的保护位.它有一个segfault处理程序,可以恢复保护位并递增计数器.我用`LD_PRELOAD`加载它,并在收到信号时开始跟踪内存访问.这产生了一些看似虚假地址的真正故障(它们在故障时不存储在任何寄存器或附近的存储器中).
  2. 我写了一个`purge`程序,它使用`mmap`从内存中分配和读取,直到`mmap`返回错误.这有望强制执行目标进程中的所有页面,这些页面在`purge`运行时被暂停.然后,我使用`pidstat`计算目标进程恢复时页面入口的数量.这似乎有效,但它是一个非常生硬的工具.它没有提供有关触摸的页面的任何信息.
  3. 我被告知valgrind允许你编写插件,导致某些事件被执行,例如内存访问.到目前为止看起来很有希望

linux memory profiling

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

X11中的消除锯齿文本

我正在尝试使用Xlib来深入了解Linux GUI程序的工作原理.我写了一个简单的程序,在一个窗口中显示"Hello,world",但它看起来很不合时宜,因为文本没有消除锯齿.

在X11中显示消除锯齿文本的最佳方法是什么?如何在GTK,Qt和其他工具包中实现抗锯齿?

linux x11 antialiasing xlib

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

LLVM支持哪些ARM体系结构?

我研究用C语言编写的软件,该软件运行在具有不同体系结构的各种ARM处理器上(主要是ARMv5,ARMv6).我们目前使用几个不同版本的RVDS编译我们的代码,但我们正在考虑使用LLVM编译一些代码以添加一些自定义检测.

我知道LLVM有ARM和Thumb目标,但它支持哪些架构?LLVM生成的代码是否可以在ARMv5上运行?我应该注意哪些限制?

architecture arm llvm

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

在OpenGL/Glut中创建Chrome多维数据集?

我试图在GLUT/OpenGL中制作一个镀铬的立方体,我不确定该怎么做.

我在教科书中查找了"材料表",其中显示"Chrome"为:环境:(0.25,0.25,0.25),漫反射:(0.4,0.4,0.4)和镜面反射:(0.774597,0.774597,0.774597).

我的问题是,如何在Glut/OpenGL中创建一个简单的立方体并将其应用于它?

我使用"glutSolidCube()"吗?如果是这样,我如何应用铬纹理呢?

任何GLUT/OpenGL人都能指出我正确的方向吗?

opengl glut cube

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

在给定受保护的内存时,如何使系统调用调用我的SIGSEGV处理程序?

我正在开发一个内存跟踪库,mprotect用于删除对大多数程序内存的访问,以及一个SIGSEGV处理程序,以便在程序触及时恢复对各个页面的访问.这在大多数情况下都很有效.

我的问题是,当程序调用系统调用(比如说read),内存中我的库已经标记为无法访问时,系统调用只返回-1并设置errnoEFAULT.这会以奇怪的方式改变正在测试的程序的行为.我希望能够在实际进入内核之前恢复对系统调用的每个内存页面的访问.

我目前的方法是为每个触及内存的系统调用创建一个包装器.在将其交给真实系统调用之前,每个包装器将触摸给它的所有内存.看起来这对于直接从程序进行的调用是有效的,但不适用于由libc进行的fread调用(例如,read不使用我的包装器直接调用).有没有更好的方法?怎么可能得到这种行为?

linux memory system-calls segmentation-fault

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