Segfault我发现自己无法诊断。
我有一个基准测试函数chrono
,它接收一个指向随机生成的字符串的数组strings
和一个对应sizes
的数组。对于调试,我打印strings
(指针指针),strings[1]
(其中一个)和sizes
(指针)。 (我还会在chrono
中打印一些字符串,并在生成它们的func中与它们的原始内容进行比较:所有内容都很好。)要进行基准测试的是一个func,它可以提供一个包字符串到字符串池中:
void pool_store_pack (StringPool * pool,
char ** strings, size_t * sizes, uint n_new);
对于debug,我在pool_store_pack中打印相同的数据。价值观也不同。 strings
已更改,strings[1]
和sizes
均为空。以下是输出示例:
strings:0x9842fa8 (n°1:0x984200c)
sizes:0x9843f48
some strings: `@PR` `MOB` `TBQ`
strings:0x804a824 (n°1:(nil))
sizes:(nil)
segmentation fault (core dumped)
我试图将错误减少到一个更简单的形式,但很难准确,因为它是驱动一个自主的库的测试代码,而不是应用程序代码。当我尝试从头开始重现这个bug时,我只是得到了预期的指针和指针,指针在接收函数中具有与发送函数中相同的值。但是,我可以发布3个相关函数的代码,如果它有帮助(但你不能运行它,因为它只是驱动其他函数)。
我很确定会错过一个显而易见的观点,但是看不到它,并且被阻挡和沮丧数小时;-)你能帮忙吗?
编辑:所以,这是涉及的整个代码:
/* Put pack of strings in pool.
*/
void pool_store_pack (StringPool * pool,
char ** strings, size_t * sizes, uint n_new) {
pool_grow(pool, n_new);
// debug /////////////////////////////////////////////////////////
printfl("n_new:%u", n_new);
printfl("strings:%p (n°1:%p)", strings, strings[1]);
printfl("sizes:%p", sizes);
printfl("some sizes: %u %u %u", sizes[1], sizes[3], sizes[9]);
printfl("some strings: '%s' '%s' '%s'", strings[1], strings[3], strings[9]);
end();
uint i;
for (i = 0; i < n_new; i++) pool_store(pool, strings[i], sizes[i]);
}
// generate random strings (constants used here are defined somewhere else)
static char ** data_strings (char ** p_bytes) {
char * bytes = malloc(n_strings * l * sizeof(char));
check_mem(bytes);
char ** strings = malloc(n_strings * sizeof(char *));
check_mem(strings);
char * s;
uint i,j;
srandom(time(NULL));
for (i=0; i<n_strings; i++) {
s = bytes + i*l;
s[size] = NUL;
for (j=0; j<size; j++) s[j] = '@' + random()%n_letters;
strings[i] = s;
}
//~ for (i=0; i<n_strings; i++) printf("'%s' ", strings[i]); line();
printfl("some strings: '%s' '%s' '%s'", strings[1], strings[3], strings[9]);
* p_bytes = bytes;
return strings;
}
// benchmark
static void chrono () {
printfl ("=== chrono pool ===============================================");
uint i;
clock_t t1, t2;
float dt;
// test data string
char * bytes;
char ** strings = data_strings(& bytes);
// string sizes are all equal to size (3)
size_t * sizes = malloc(n_strings * sizeof(size_t));
check_mem(sizes);
for (i=0; i<n_strings; i++) sizes[i] = size;
// debug ///////////////////////////////////////////////////////////////////
printfl("n_strings:%u", n_strings);
printfl("strings:%p (n°1:%p)", strings, strings[1]);
printfl("sizes:%p", sizes);
printfl("some sizes: %u %u %u", sizes[1], sizes[3], sizes[9]);
printfl("some strings: '%s' '%s' '%s'", strings[1], strings[3], strings[9]);
// now, feed the pool
StringPool * pool = stringpool();
t1 = clock();
pool_store_pack(pool, strings, sizes, n_strings);
t2 = clock();
end();
dt = 1.0 * (t2 - t1) / CLOCKS_PER_SEC;
print("pool data : "); show_pool_data(pool);
print("pool stats : "); show_pool_stats(pool, false);
printfl("time : %.3f", dt);
free(bytes);
free(strings);
}
答案 0 :(得分:2)
好运!实际上有2个错误,互相交互。首先,错误地重新定义静态常量,给出一组初始字符串的大小来提供池(实际上只有""
,所以这个集合的长度为1)。其次,2个指令的反转使得池在初始化之前使用。交互是初始化还使用pool_store_pack为池提供所述初始字符串。
==&GT;
我得到的调试输出(并显示给你)反映了调用此func pool_store_pack进行池初始化的数据,而不是来自chrono函数(因此,strings[1]
为零,因为初始集中只有一个字符串!)。而且sizes
是零,因为它是静态常数错误地改变了...妈妈咪!
谢谢大家!不幸的是,我不能投票给你,因为只有评论......