月度归档:2017年03月

Linux 下如何保存并恢复 firefox 的设置

要自动化firefox的一些操作, 除了 firefox 的 一些命令行参数: http://kb.mozillazine.org/Command_line_arguments 外, 可以修改一份 firefox 的设置并保存, 然后在新的机器上,只需要先恢复设置, 再启动 firefox.

firefox 的设置在一个叫 profile 的 文件夹中. 文件夹位置在这里:
http://kb.mozillazine.org/Profile_folder

只需要保存这个目录, 然后复制到新机器的相同位置即可.
byNeil
byNeil.com

原文来自 Blog by Neil, post Linux 下如何保存并恢复 firefox 的设置 转载请注明出处。本站保留一切权力

Delphi/c++builder 中出现 “float operation exception”

编译好的 dll 在 c++ builder 64 位中调用,出现 "float operation exception".

尝试了 32位, 没有问题.

尝试了纯console 的 c++ builder 程序, 也没有问题. 只有包含 vcl 的 c++ builder 程序才有问题.

让我感觉到可能是 vcl 改变了 runtime 的某种行为.

跟踪了代码, 异常发生在这一行:
https://github.com/v8/v8/blob/3.20.17/src/conversions.h#L75

inline int FastD2I(double x) {
  return static_cast<int>(x);
}

当 x 大于 int 的 max 值时,问题出现.

虽然这种转换会导致溢出, 但是怎么会引发异常呢?

然后找到:
https://www.opengl.org/discussion_boards/showthread.php/156817-Disabling-Floating-Point-Exceptions

看起来, opengl 也遇到相同的问题.

然后找到:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c310909a-fe07-4a4e-92d7-be2e1dc81137/finding-cause-of-floating-point-invalid-operation?forum=vsdebug

最终找到了这篇文章:

Random and unexpected EXCEPTION_FLT_DIVIDE_BY_ZERO and EXCEPTION_FLT_INVALID__OPERATION

原来 cpu 在操作浮点数时有专门的 fpu 寄存器.

而浮点数如果出现溢出等情况时, 是否导致异常是由一个专门的寄存器 fpcw 控制.

在 windows 平台上, fpcw 的值默认是忽略浮点溢出的异常的.
但是有的程序可能会改变 fpcw 的值, 来引发异常.

解决方案: 执行自己的代码时, 恢复 fpcw 的默认值, 用完再回滚.

头文件:

#include "float.h"

获得当前 fpcw 的值:

int old_fpcw = _controlfp(0,0)

设置 fpcw 为 windows 上的默认值:

_controlfp(MCW_EM, MCW_EM);

用完后, 回滚到原始值:

_controlfp(old_fpcw, _MCW_DN | _MCW_EM |_MCW_RC  )

另外, 这里还有一篇文章介绍fpu 的工作方式:
http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm
byNeil
byNeil.com

原文来自 Blog by Neil, post Delphi/c++builder 中出现 “float operation exception” 转载请注明出处。本站保留一切权力

如何编译 google chrome v8 引擎

谷歌 chrome v8 引擎可以嵌入到自己的 c++ 程序中. 一般可以把 v8 编译成 dll, 然后调用.
还可以把 v8 编译成静态库, 静态链接到自己的程序中. 要编译v8的源代码可不是件容易的事.
这里记录下步骤:

  1. Pure Windows 7 x64
  2. Install python 2.7
  3. Install git https://git-scm.com/, v8 needs git bash to compile. Then edit the C:\Users\neil\.bashrc file:
export DEPOT_TOOLS_WIN_TOOLCHAIN=0
  1. Install VS2013, Express edition is ok. Edit Windows Registry:
    HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\12.0.
    Crate a String value: InstallDir, value is: C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\
    If you already have the value there, just ignore this step.
  2. If you don't have this file: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat, copy one.
  3. Install VS2015, Express edition is ok.
  4. Install Windows 10 sdk: https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
  5. Install google depot_tools https://www.chromium.org/developers/how-tos/install-depot-tools
  6. Open git-bash, get v8 source code:
fetch v8
  1. Generate vs 2015 project, static lib without snapshot, release edition:
cd v8
gn gen out-release/Default --args="v8_static_library=true is_component_build=false v8_use_external_startup_data=false v8_use_snapshot=false is_debug=false" --ide=vs2015

注意:
1. 第 4 步, 可能是因为 VS2013 express 版有点残, 如果你是pro 或者 ultimate版 可能不需要.
2. 第 8 步, 需要从 google 同步很多工具, 在中国, 你懂得.
3. 第 10 步, 个的参数是生成静态库. 不加,就是动态库. 要查看所有可用参数: "gn args --list" for available build arguments.

refs:
1. https://www.chromium.org/developers/how-tos/install-depot-tools
2. https://v8project.blogspot.com/2015/09/custom-startup-snapshots.html
3. https://chromium.googlesource.com/chromium/src/tools/gn/+/HEAD/docs/reference.md
4. https://stackoverflow.com/questions/38674676/building-and-linking-v8-in-visual-studio
byNeil
byNeil.com

原文来自 Blog by Neil, post 如何编译 google chrome v8 引擎 转载请注明出处。本站保留一切权力