Skip to content

Commit 8c1a80b

Browse files
committed
Move sample doc to another file
1 parent 3b858a6 commit 8c1a80b

File tree

2 files changed

+76
-51
lines changed

2 files changed

+76
-51
lines changed

docs/foreground.md

Lines changed: 1 addition & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -61,57 +61,7 @@ Python 相关源代码直接转换
6161
这类问题使用普通调试器一般很难发现,代码帮可以应用于发现数据方面的问题。为了提高
6262
运行速度和性能,需要下载代码帮 App 在本地运行。
6363

64-
具体实例为 PyArmor 开发中遇到的堆栈问题,在使用新的包裹模式 2 加密的脚本,在
65-
MacOS (10.14.6) 上的 Python 3.7.7 的环境下面运行总是出现崩溃现象
66-
67-
Segmentation fault: 11
68-
69-
首先安装 pyarmor 6.0.2 ,然后编译一个有问题的动态库 `_pytransform.dylib` 。在 的
70-
私有库 [pytransform](https://github.com/jondy/pytransform) 的上面使用了 tag
71-
`codebang-crash` 专门保存了这个有问题的代码
72-
73-
cd /path/to/pytransform/src
74-
git checkout codebang-crash
75-
make clean && make
76-
cp ../build/darwin_x86_64/.libs/_pytransform.dylib /path/to/pyarmor/platforms/darwin/x86_64
77-
78-
然后使用这个动态库加密一个简单的脚本 [foo.py](samples/crash/foo.py)
79-
80-
cd /path/to/samples/crash
81-
pyarmor obfuscate --exact foo.py
82-
83-
运行加密脚本,会直接出现奔溃
84-
85-
cd dist
86-
python3 foo.py
87-
88-
随后在编译一个解决了这个问题的版本,使用标签 `codebang-fixed` 指定的代码,这样加
89-
密的脚本可以正常运行
90-
91-
cd /path/to/pytransform/src
92-
git checkout codebang-fixed
93-
make clean && make
94-
cp ../build/darwin_x86_64/.libs/_pytransform.dylib /path/to/samples/crash/dist/pytransform
95-
96-
可以基于上面的示例程序展示代码帮如何发现内存堆栈导致的问题。
97-
98-
但是这个修正没有解决真正的问题,脚本 [queens.py](samples/crash/queens.py) 加密后
99-
还是会崩溃,因为真正的问题是没有对 f_valuestack 进行相应的赋值,从而造成的真正的
100-
代码执行完成之后,在使用下面的代码清空本层堆栈的时候,意外的把多余的两个影子堆栈
101-
里面的元素推出堆栈,对其引用计数进行修改而导致的异常
102-
103-
```c
104-
assert(why != WHY_YIELD);
105-
/* Pop remaining stack entries. */
106-
while (!EMPTY()) {
107-
PyObject *o = POP();
108-
Py_XDECREF(o);
109-
}
110-
```
111-
112-
解决这个问题的代码是在标签 `codebang-fixed-2` ,关键语句
113-
114-
GET_FRAME_VALUESTACK(frame) = old_valuestack + 2;
64+
具体实例参考 [PyArmor 开发中遇到的堆栈问题](samples/README.md)
11565

11666
2.1 图形化的显示内存数据
11767

docs/samples/README.md

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# CodeBang 应用实例
2+
3+
PyArmor 开发中遇到的一个堆栈问题,在使用新的包裹模式 2 加密的脚本,在MacOS
4+
(10.14.6) 上的 Python 3.7.7 的环境下面运行总是出现崩溃现象
5+
6+
Segmentation fault: 11
7+
8+
## 环境配置
9+
10+
在 Linux 下面,使用下面的命令生成单独的调试信息 `.dwarf` 文件,例如
11+
12+
gcc -g -gsplit-dwarf -o foo.so foo.c
13+
14+
cp foo.so foo.dwo /path/to/dist/
15+
16+
在 Mac 下面,使用选项 `-g` 保存调试信息,然后使用 `dysym` 生成独立的调试信息目录
17+
.dySYM,最好把动态库里面的调试信息删除
18+
19+
gcc -g -shared -o foo.so foo.c
20+
dsymutil foo.so
21+
strip -x foo.so
22+
23+
cp -a foo.so foo.so.dSYM /path/to/dist
24+
25+
xcrun python3 lldb-proxy.py
26+
27+
## 代码版本
28+
29+
首先安装 pyarmor 6.0.2 ,然后编译一个有问题的动态库 `_pytransform.dylib` 。在 的
30+
私有库 [pytransform](https://github.com/jondy/pytransform) 的上面使用了 tag
31+
`codebang-crash` 专门保存了这个有问题的代码
32+
33+
cd /path/to/pytransform/src
34+
git checkout codebang-crash
35+
make clean && make
36+
cp ../build/darwin_x86_64/.libs/_pytransform.dylib /path/to/pyarmor/platforms/darwin/x86_64
37+
38+
然后使用这个动态库加密一个简单的脚本 [foo.py](samples/crash/foo.py)
39+
40+
cd /path/to/samples/crash
41+
pyarmor obfuscate --exact foo.py
42+
43+
运行加密脚本,会直接出现奔溃
44+
45+
cd dist
46+
python3 foo.py
47+
48+
随后在编译一个解决了这个问题的版本,使用标签 `codebang-fixed` 指定的代码,这样加
49+
密的脚本可以正常运行
50+
51+
cd /path/to/pytransform/src
52+
git checkout codebang-fixed
53+
make clean && make
54+
cp ../build/darwin_x86_64/.libs/_pytransform.dylib /path/to/samples/crash/dist/pytransform
55+
56+
可以基于上面的示例程序展示代码帮如何发现内存堆栈导致的问题。
57+
58+
但是这个修正没有解决真正的问题,脚本 [queens.py](samples/crash/queens.py) 加密后
59+
还是会崩溃,因为真正的问题是没有对 f_valuestack 进行相应的赋值,从而造成的真正的
60+
代码执行完成之后,在使用下面的代码清空本层堆栈的时候,意外的把多余的两个影子堆栈
61+
里面的元素推出堆栈,对其引用计数进行修改而导致的异常
62+
63+
```c
64+
assert(why != WHY_YIELD);
65+
/* Pop remaining stack entries. */
66+
while (!EMPTY()) {
67+
PyObject *o = POP();
68+
Py_XDECREF(o);
69+
}
70+
```
71+
72+
解决这个问题的代码是在标签 `codebang-fixed-2` ,关键语句
73+
74+
GET_FRAME_VALUESTACK(frame) = old_valuestack + 2;
75+

0 commit comments

Comments
 (0)