共享对象是在RedHat Linux上构建的,虽然所有代码都是使用debug编译的,但调试器(gdb)拒绝加载符号并发出错误,如下所示:
...
GNU gdb Fedora (6.8-37.el5)
...
This GDB was configured as "x86_64-redhat-linux-gnu"...
Dwarf Error: wrong version in compilation unit header (is 4, should be 2) [in module libgrokf.so]
Run Code Online (Sandbox Code Playgroud)
有了这个错误,我无法在任何函数中触发断点,也看不到正确的堆栈跟踪.我重新编译了整个项目,但没有任何帮助.我知道在过去的某个时间调试该模块没有问题.
是什么导致了这个问题?
我有一个可移植的程序,它假设它是有符号整数,使用ssize_t.从概念上讲,它的确如下:
#include <stdint.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
size_t size_10 = 10;
size_t size_20 = 20;
ssize_t len_diff;
len_diff = (ssize_t)size_10 - (ssize_t)size_20;
if (len_diff < 0)
printf("negative\n");
else if (len_diff > 0)
printf("positive\n");
else
printf("zero\n");
}
Run Code Online (Sandbox Code Playgroud)
人们会期望该程序打印"负面",而是打印"正面".原因很容易从ssize_t的定义中看到(在sourceannotations.h中):
#ifndef _SSIZE_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 ssize_t;
#else
typedef _W64 unsigned int ssize_t;
#endif
#define _SSIZE_T_DEFINED
#endif
Run Code Online (Sandbox Code Playgroud)
因此,减去两个无符号值会导致无符号值,从而得到结果.
在旧版本的Windows SDK(例如V7.0A)中,ssize_t被正确定义为:
//
// SIZE_T used for counts or ranges which need to span the range of
// of a …Run Code Online (Sandbox Code Playgroud) 我需要创建一个写入文本文件的批处理文件(可能包括变量)。在带有bash的Unix中,这很简单:
#!/bin/bash
ver="1.2.3"
cat > file.txt <<EOL
line 1, ${ver}
line 2
line 3
...
EOL
Run Code Online (Sandbox Code Playgroud)
用批处理文件执行此操作的最简单方法是什么?
注意:对于Windows批处理,有一个完整的解决方案在Heredoc上使用'heredoc'例程吗?但是对于临时使用来说似乎太复杂了。我正在寻找一种快速简单的方法。
寻找内存泄漏我最近注意到进程资源管理器(Microsoft/Sysinternals v16.26 的 procexp.exe)报告的虚拟内存值非常高 - 大约 2.1TB,其中我的笔记本电脑有 32GB RAM 运行 Win10Pro X64。例如,它报告 Chrome.exe 进程的虚拟内存大小为 2,151,819,136 KB。知道是什么原因造成的吗?
获得一个简单的任务来获取XPath表达式并返回一个与(可能)选择的节点的父节点匹配的前缀.
例:
/aaa/bbb => /aaa
/aaa/bbb/ccc => /aaa/bbb
/aaa/bbb/ccc[@x='1' and @y="/aaa[name='z']"] => /aaa/bbb
Run Code Online (Sandbox Code Playgroud)
因为方括号内的模式可能包含引号内的括号,所以我决定尝试使用正则表达式来实现这一点.这是一段代码片段:
string input =
"/aaa/bbb/ccc[@x='1' and @y=\"/aaa[name='z'] \"]";
// ^-- remove space for no loop
string pattern = @"/[a-zA-Z0-9]+(\[([^]]*(]"")?)+])?$";
System.Text.RegularExpressions.Regex re =
new System.Text.RegularExpressions.Regex(pattern);
bool ismatch = re.IsMatch(input); // <== Infinite loop in here
// some code based on the match
Run Code Online (Sandbox Code Playgroud)
因为模式是相当规则的,我寻找'/'后面跟着一个标识符,然后是一个在字符串末尾匹配的可选组(....)?$
代码似乎工作但输入字符串的不同值,我发现通过简单地插入一个空格(在注释中显示的位置),.NET IsMatch函数进入一个无限循环,获取它获得的所有CPU .
现在无论这个正则表达式模式是否是最好的(我有更复杂但简化它来显示问题),这似乎表明使用RegEx与任何不重要的事情可能是非常危险的.
我错过了什么吗?有没有办法防止正则表达式匹配中的无限循环?
windows ×3
.net ×1
batch-file ×1
c ×1
dwarf ×1
gdb ×1
memory ×1
regex ×1
sysinternals ×1
types ×1