我需要一位真正的C大师的帮助来分析我的代码中的崩溃.不是为了解决崩溃; 我可以很容易地解决它,但在这之前我想了解这种崩溃是如何可能的,因为这对我来说似乎完全不可能.
此崩溃只发生在客户机器上,我无法在本地重现(因此我无法使用调试器逐步执行代码),因为我无法获取此用户数据库的副本.我的公司也不允许我只更改代码中的几行并为该客户进行自定义构建(因此我无法添加一些printf行并让他再次运行代码)当然客户的构建没有调试符号.换句话说,我的补偿能力非常有限.尽管如此,我可以确定崩溃并获得一些调试信息.但是,当我查看该信息然后在代码中,我无法理解程序流程如何能够到达相关行.代码应该在到达该行之前很久就已经崩溃了.我完全迷失在这里.
让我们从相关代码开始.这是非常少的代码:
// ... code above skipped, not relevant ...
if (data == NULL) return -1;
information = parseData(data);
if (information == NULL) return -1;
/* Check if name has been correctly \0 terminated */
if (information->kind.name->data[information->kind.name->length] != '\0') {
freeParsedData(information);
return -1;
}
/* Copy the name */
realLength = information->kind.name->length + 1;
*result = malloc(realLength);
if (*result == NULL) {
freeParsedData(information);
return -1;
}
strlcpy(*result, (char *)information->kind.name->data, realLength);
// ... code below skipped, not relevant ... …Run Code Online (Sandbox Code Playgroud) 我可以使用带有静态链接的gcc构建可执行文件:
gcc -static xxx.c -o xxx
所以我可以在没有任何外部依赖库的情况下运行xxx.
但是,如果我想构建没有外部依赖库的共享库呢?我的意思是我希望共享库静态链接其外部引用.
在装配中实现它似乎不太难.
gcc还有一个标志(-fnested-functions)来启用它们.
一位研究人员在MATLAB中创建了一个小型模拟,我们希望让其他人可以访问它.我的计划是进行模拟,清理一些东西并将其转换为一组函数.然后我打算将它编译成C库并使用SWIG创建一个Python包装器.那时我应该可以从一个小的Django应用程序调用模拟.至少我希望如此.
我有正确的计划吗?有没有其他人做过类似的事情?如果有任何我目前不知道的严重陷阱,你能告诉我吗?
我将在几年后重新进入MFC世界寻找新工作.人们建议刷新内存的资源是什么?我最近主要做C#.
还有人推荐的任何以MFC为中心的网站或博客?
我想将字节数组的内容向左移12位.
例如,从这个类型的数组开始uint8_t shift[10]:
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xBC}
Run Code Online (Sandbox Code Playgroud)
我想将它向左移12位,结果是:
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0xC0, 0x00}
Run Code Online (Sandbox Code Playgroud) 谁知道这个编译器功能?GCC似乎支持这一点.它是如何工作的?潜在收益是多少?在哪种情况下它很好?内环?
(这个问题是具体的,不是关于一般的优化,谢谢)
我有时需要修改OSS代码或其他人的代码(通常是基于C的,但有时候是C++/Java)并找到自己的"grep"类型,函数声明等标题,因为我遵循代码流并尝试理解系统.是否有一个很好的工具可以帮助代码浏览.我希望能够点击一个类型并被带到声明或点击一个函数名称并被带到它的实现.我在Linux机器上,所以像"只使用Visual Studio"这样的回复不一定适合我.谢谢!
在大多数C或C++环境中,存在"调试"模式和"释放"模式编译.
看看两者之间的区别,您会发现调试模式添加了调试符号(通常是许多编译器上的-g选项),但它也会禁用大多数优化.
在"发布"模式下,您通常会启用各种优化.
为什么不同?