我正在为C中的一些非常短的操作编写一些微基准测试代码.例如,我测量的一件事是根据传递的参数数量调用空函数需要多少个周期.
目前,我在每次操作之前和之后使用RDTSC指令进行计时,以获得CPU的循环计数.但是,我担心在第一个RDTSC之前发出的指令可能会减慢我正在测量的实际指令.我还担心在第二个RDTSC发布之前可能无法完成整个操作.
有没有人知道x86指令强制所有正在进行的指令在发出新指令之前提交?我被告知CPUID可能会这样做,但我一直无法找到任何说明的文档.
我目前工作的一个项目,我需要跟踪的几个系统调用和低级别的功能,如使用mmap,brk,sbrk.到目前为止,我一直在使用函数插入来执行此操作:我编写了一个与我正在替换的函数同名的包装函数(mmap例如),并通过设置LD_PRELOAD环境变量将其加载到程序中.我通过我加载的指针调用实际函数dlsym.
不幸的是,我想要包装的函数之一在sbrk内部使用dlsym,因此当我尝试加载符号时程序崩溃.sbrk在Linux中不是系统调用,所以我不能简单地使用syscall它来间接调用它.
所以我的问题是,如何在不使用相同名称的包装函数的情况下调用库函数dlsym?是否有任何编译器技巧(使用gcc)让我参考原始函数?
假设我有两个类,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) 我在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)例如:
// 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) 有谁知道在Cocoa NSOpenGLView中绘制任意文本的简单方法?我有几个限制.
这是一个奇怪的问题,但是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) 我想跟踪各种程序在特定状态下触摸的内存量.例如,假设我有一个图形程序.当它被最小化时,它可能会使用更少的内存,因为它不会重绘窗口,这需要读取图像和字体并执行大量的库函数.这些对象仍可在内存中访问,但实际上并未使用它们.
类似top的工具是有限使用的,因为它们只是告诉多少内存映射到程序的地址空间,以及它有多少驻留在物理RAM中.同样,泄漏检测器只会告诉内存何时无法访问,而不是仅仅是因为它没有被使用.
是否存在可以以这种方式跟踪活动使用/未使用的内存的现有工具?如果可能的话,我不仅要跟踪堆上的使用情况,还要跟踪存储程序/库代码的内存.
编辑:我想澄清一下:我想知道程序实际读取,写入或执行某个点之后的内存,即一旦达到某个状态.虽然地址空间中的页数和常驻页数是重要的测量值,但这不是我想要的.
我现在正在追求三种方法:
我正在尝试使用Xlib来深入了解Linux GUI程序的工作原理.我写了一个简单的程序,在一个窗口中显示"Hello,world",但它看起来很不合时宜,因为文本没有消除锯齿.
在X11中显示消除锯齿文本的最佳方法是什么?如何在GTK,Qt和其他工具包中实现抗锯齿?
我研究用C语言编写的软件,该软件运行在具有不同体系结构的各种ARM处理器上(主要是ARMv5,ARMv6).我们目前使用几个不同版本的RVDS编译我们的代码,但我们正在考虑使用LLVM编译一些代码以添加一些自定义检测.
我知道LLVM有ARM和Thumb目标,但它支持哪些架构?LLVM生成的代码是否可以在ARMv5上运行?我应该注意哪些限制?
我试图在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人都能指出我正确的方向吗?
我正在开发一个内存跟踪库,mprotect用于删除对大多数程序内存的访问,以及一个SIGSEGV处理程序,以便在程序触及时恢复对各个页面的访问.这在大多数情况下都很有效.
我的问题是,当程序调用系统调用(比如说read),内存中我的库已经标记为无法访问时,系统调用只返回-1并设置errno为EFAULT.这会以奇怪的方式改变正在测试的程序的行为.我希望能够在实际进入内核之前恢复对系统调用的每个内存页面的访问.
我目前的方法是为每个触及内存的系统调用创建一个包装器.在将其交给真实系统调用之前,每个包装器将触摸给它的所有内存.看起来这对于直接从程序进行的调用是有效的,但不适用于由libc进行的fread调用(例如,read不使用我的包装器直接调用).有没有更好的方法?怎么可能得到这种行为?