我现在在一个相当庞大的C++应用程序中出现了一个非常奇怪的错误(大量的CPU和RAM使用以及代码长度 - 超过100,000行).这是在双核Sun Solaris 10计算机上运行的.该程序订阅股票价格馈送并将其显示在用户配置的"页面"上(页面是由用户定制的窗口构造 - 该程序允许用户配置这些页面).在其中一个底层库变为多线程之前,该程序过去没有问题.受此影响的程序部分已相应更改.关于我的问题.
大约每三次执行一次,该程序将在启动时出现段错误.这不一定是一个严格的规则 - 有时它会连续三次崩溃,然后连续工作五次.这是有趣的段错(阅读:痛苦).它可以以多种方式表现出来,但最常见的是函数A调用函数B,并且在进入函数B时,帧指针将突然设置为0x000002.功能A:
result_type emit(typename type_trait<T_arg1>::take _A_a1) const
{ return emitter_type::emit(impl_, _A_a1); }
Run Code Online (Sandbox Code Playgroud)
这是一个简单的信号实现.impl_和_A_a1在崩溃时在其框架内定义良好.在实际执行该指令时,我们最终在程序计数器0x000002处.
这并不总是发生在该功能上.事实上,它发生在很多地方,但这是一个更简单的案例,不会留下太多的错误空间.有时会发生什么是堆栈分配的变量将突然出现在垃圾内存(总是在0x000002上),无论如何.其他时候,相同的代码将运行得很好.所以,我的问题是,什么能够严重破坏堆栈?什么可以实际改变帧指针的值?我当然没听说过这样的事情.关于我能想到的唯一一件事是在数组上写出越界,但是我用堆栈保护器构建了它,它应该提供任何发生的实例.我也在这里的堆栈范围内.我也不喜欢 看看另一个线程如何覆盖第一个线程堆栈上的变量,因为每个线程都有自己的堆栈(这都是pthreads).我已经尝试在linux机器上构建它,虽然我没有在那里得到段错误,但大约有三分之一它会冻结在我身上.
如果您有一个很好的例子,只需使用openssl加密文件,这比我遇到问题的文件更好,我将非常感激.
更新:作者Myabe是正确的.在我没有分配的东西上使用memset让我想起strtok对非堆栈变量的窒息.
Update2:使用malloc使核心转储停止.更新了代码.控件Hs仍在出现.更新代码以反映这一点.
Update3:示例中的循环结构显示不正确.我不确定后续读取的发生方式是否大于初始读取的大小.
Update4:我想我找到了.decrypt loop有一个olen + = tlen,缓冲区应丢弃该组位.:( 不是.
Update99988: 我已经放弃了所有的希望.我想我需要抛弃这个例子,而是从Openssl书中开始.解密后,中间层缓冲区预先添加了^ H,但由于指针传入,我开始怀疑对齐问题.
我想我可能在一个糟糕的例子开始的船上比从头开始更糟糕.我不得不做一些更正(原件在下面的代码中注释).原作者在传递地址方面存在一些问题.作者使用的1024和1032不同大小的缓冲区正在激发我的想法,但我认为它与8位种子和链式加密调用有关.
我在(控制Hs)中获取垃圾字符,并且像解密这样的核心转储正在破坏堆栈.我对加密,openssl相当新,而且我对gdb并不熟悉.
我已尽一切努力简化这一过程
compile.sh
gcc -g -o blowfish blowfish.c -lcrypto
Run Code Online (Sandbox Code Playgroud)
run.sh
ulimit -c unlimited
./blowfish example.txt encrypted_example decrypted_example
echo diff example.txt decrypted_example
diff example.txt decrypted_example
Run Code Online (Sandbox Code Playgroud)
clean.sh
rm -rf blowfish encrypted_example decrypted_example core
Run Code Online (Sandbox Code Playgroud)
example.txt文件
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud …Run Code Online (Sandbox Code Playgroud) 我在嵌入式环境中检测到内存损坏(我的程序在带有专有操作系统的机顶盒上运行).但我无法得到它的根本原因.在多次启动和退出应用程序的压力测试之后检测到内存损坏本身.因为腐败变量每次启动应用程序时都会更改它的地址,所以我无法设置内存断点,是否有任何想法可以找出这种损坏的根本原因?
(内存断点是当环境改变给定内存地址的值时启动的断点)
另请注意,我的所有软件都是使用C语言开发的.
谢谢你的帮助.
我想平均一些被零均值高斯加性噪声破坏的.jpg图像.在搜索之后,我想出了添加图像矩阵并将总和除以矩阵的数量.但是,得到的图像是全黑的.通常,当图像数量增加时,结果图像变得更好.但是当我使用更多图像时,它会变暗.
我使用800x600黑白.jpg图像.这是我使用的脚本:
image1 = imread ('PIC1.jpg');
image2 = imread ('PIC2.jpg');
image3 = imread ('PIC3.jpg');
image4 = imread ('PIC4.jpg');
sum = image1 + image2 + image3 + image4;
av = sum / 4;
imshow(av);
Run Code Online (Sandbox Code Playgroud) 我有一个 Zip 存档,其中包含一个无法解压的大(重要)文件。我尝试过的所有 Zip 实用程序,包括那些声称可以恢复/修复损坏的 Zip 存档的实用程序,都无法提取包含损坏的 zlib 压缩数据的文件。他们获取存档中的所有文件,但损坏的条目除外,该条目会被跳过。
我用 C# 编写了一个小型实用程序应用程序,它解析 zip 存档、识别每个条目并解析字段、解密数据部分,然后使用 DeflateStream(来自 zlib 的 .Net 实现)解压缩它们。一切正常,直到我找到损坏的入口。损坏的条目成功且完全解密(在 CTR 模式下使用 AES),但 DeflateStream 读取器在抛出“错误状态(超额订阅动态位长度树)”之前只能读取大约 40MB 的解密数据。
是否有可能以某种方式“寻找”损坏的部分并继续解压缩数据?我想恢复尽可能多的文件,即使有一些漏洞。DeflateStream 没有实现 Seek 方法,如果我尝试创建一个新的 DeflateStream,并将底层 FileStream 定位到最后读取的位置,它会抛出相同的“Bad State”异常。
在发布模式下构建后,我看到了在调试模式下未发生的异常。调试发布版本时,字符串引用似乎没有从 EXE(我们的应用程序)正确传递到接收字符串引用的 DLL。
我们的 EXE 代码如下所示:
string contents = "handle_message(): received=" + msg->encode();
LOG4CXX_DEBUG(logger, contents);
Run Code Online (Sandbox Code Playgroud)
是LOG4CXX_DEBUG的log4cxx.dll,其代码如下所示:
CharMessageBuffer& CharMessageBuffer::operator<<(const std::basic_string<char>& msg) {
if (stream == 0) {
buf.append(msg);
} else {
*stream << msg;
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
查看调试器中的调用堆栈,当我向下导航到包含源代码的框架时,我可以看到这contents是一个带有size=583, capacity=838.
log4cxx.dll在(堆栈中上面的下一帧) 内部的帧中,字符串引用显示size=838, capacity=363113231(并且值都是垃圾)。
我们的应用程序和 log4cxx.dll 都是在同一台计算机上编译的,使用相同的运行时设置 (/MD),但 Visual Studio 版本不同。log4cxx dll 是使用 Visual Studio 2008 编译的,我们的应用程序是使用 Visual Studio 2010 编译的。在 2 个对象上运行 dumpbin 显示:
我们的应用程序(EXE)
MSVCP100.dll
MSVCR100.dll
Run Code Online (Sandbox Code Playgroud)
log4cxx.dll (DLL)
MSVCP90.dll …Run Code Online (Sandbox Code Playgroud) 从航站楼,我
sudo su postgres
psql
\l:
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
nwnx | nwnx | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | …Run Code Online (Sandbox Code Playgroud) 我遇到了chkdsk第 3 阶段错误(与 NTFS usn 日志和安全描述符相关)。
损坏的 NTFS 日志会阻止chkdsk /f运行卷修复。因此chkdsk修复将无法进行,这不是解决方案。
但是,我听说可以通过删除并重新创建 NTFS 日志来修复损坏。这可以通过在命令提示符或具有管理员权限的 PowerShell 中执行以下命令来完成:
fsutil usn deletejournal /d /n
Run Code Online (Sandbox Code Playgroud)
其次是
fsutil usn createjournal m=<maxsize> a=<allocationdelta> <volumepath>
Run Code Online (Sandbox Code Playgroud)
但是,有关这些命令的开关和参数的 Microsoft 文档非常少。任何人都可以请建议:
<maxsize>和参数是什么<allocationdelta>?<maxsize>值<allocationdelta>?默认值是多少?最后,以这种方式删除 NTFS 日志有多安全?
谢谢。
我目前正在使用liveKD执行内核调试.
在我发生阻塞的所有情况下(一个::CloseHandle()永不返回的函数调用)我碰巧有一个堆栈跟踪,它在内核中阻塞了synchronisationEvent.
但是当我这样做时,!object 12345678如果123456789是我synchronisationEvent在流程的线程信息中报告的,它说Not a valid object (ObjectType invalid).
我担心在用户模式下我们的应用程序级别的损坏是否会破坏内核?Windows是否能保证内存空间的分离能阻止类似内容的发生?
应用程序的代码密集使用C++,COM/DCOM和Win32.
THREAD 856a2d48 Cid 0660.0350 Teb: 7ff25000 Win32Thread: ffaaedd8 WAIT: (Executive) KernelMode Non-Alertable
860c6f9c SynchronizationEvent
IRP List:
babea5d8: (0006,01d8) Flags: 00000404 Mdl: 00000000
Not impersonating
DeviceMap 89809fc8
Owning Process 86212d40 Image: DataCaptorIS.exe
Attached Process N/A Image: N/A
Wait Start TickCount 27315407 Ticks: 6067021 (1:02:17:26.134)
Context Switch Count 2259 IdealProcessor: 0
UserTime 00:00:04.976
KernelTime 00:00:02.184
Win32 Start Address 0x775c03e9
Stack Init … 我们有这个HBase集群:30多个节点,48个表,HDFS级别40 + TB,复制因子2.由于两个节点上的磁盘故障,我们在HDFS上有一个损坏的文件.
hdfs fsck /输出摘录,显示损坏的HBase区域文件:
/user/hbase/table_foo_bar/295cff9c67379c1204a6ddd15808af0b/n/ae0fdf7d0fa24ad1914ca934d3493e56:
CORRUPT blockpool BP-323062689-192.168.12.45-1357244568924 block blk_9209554458788732793
/user/hbase/table_foo_bar/295cff9c67379c1204a6ddd15808af0b/n/ae0fdf7d0fa24ad1914ca934d3493e56:
MISSING 1 blocks of total size 134217728 B
CORRUPT FILES: 1
MISSING BLOCKS: 1
MISSING SIZE: 134217728 B
CORRUPT BLOCKS: 1
The filesystem under path '/' is CORRUPT
Run Code Online (Sandbox Code Playgroud)
丢失的数据无法恢复(磁盘已损坏).
据HBase说,一切都很好,花花公子
hbase hbck 说:
Version: 0.94.6-cdh4.4.0
...
table_foo_bar is okay.
Number of regions: 1425
Deployed on: ....
...
0 inconsistencies detected.
Status: OK
Run Code Online (Sandbox Code Playgroud)
此外,似乎我们仍然可以查询来自损坏区域文件的非丢失块的数据(据我所知,我能够根据该区域的开始和结束行键进行检查).
hadoop fs -rm或 hadoop fsck -delete /).这将"修复"HDFS级别的损坏. …