質問編集履歴
5
質問したいことをシンプルにしました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,44 +1,44 @@
|
|
1
1
|
###質問内容
|
2
2
|
|
3
|
-
現在Go言語でプログラミングを勉強中で、
|
4
|
-
|
5
|
-
cgoでDLLの関数を呼び出すようなプログラムを作っています。
|
3
|
+
現在Go言語でプログラミングを勉強中で、cgoでDLLの関数を呼び出すようなプログラムを作っています。
|
4
|
+
|
5
|
+
|
6
|
+
|
6
|
-
|
7
|
+
呼び出したいライブラリproprietarydll.dllは下記のproprietarydll.hにあるような関数を持っており、
|
7
|
-
|
8
|
-
|
8
|
+
|
9
|
-
|
9
|
+
こちらをGo言語から呼びだそうとしていました。
|
10
|
-
|
10
|
+
|
11
|
-
|
11
|
+
ところが、proprietarydll.dllの関数を呼び出した後しばらくすると、
|
12
|
-
|
12
|
+
|
13
|
-
|
13
|
+
**"fatal error: invalid stack pointer"**というエラーが出てプログラムが終了してしまいました。
|
14
|
+
|
15
|
+
|
16
|
+
|
14
|
-
|
17
|
+
エラーはGCの際に起きているようだったので、
|
18
|
+
|
15
|
-
|
19
|
+
proprietarydll.dllの関数呼び出しの後にGCを呼び出すcrash.goのようなプログラムを書いたところ、
|
16
|
-
|
20
|
+
|
17
|
-
G
|
21
|
+
GCが行われた時に同様のエラーが発生していることが確認できました。
|
22
|
+
|
23
|
+
|
24
|
+
|
18
|
-
|
25
|
+
しかし、エラーが発生している箇所はわかったのですが、
|
26
|
+
|
19
|
-
|
27
|
+
このエラーが何故起きているのかはわかりませんでした。
|
28
|
+
|
29
|
+
|
20
30
|
|
21
31
|
類似した質問もなく、修正のための原因がわからず、質問しました。
|
22
32
|
|
23
33
|
|
24
34
|
|
25
|
-
このエラーの原因は何
|
35
|
+
このエラーの原因は何でしょうか。
|
26
|
-
|
27
|
-
|
36
|
+
|
28
|
-
|
29
|
-
|
37
|
+
|
30
|
-
|
31
|
-
|
38
|
+
|
32
|
-
|
33
|
-
(Cから使う際には問題なく動くそうなのでこちらではないと思っています)
|
34
|
-
|
35
|
-
- 他の原因でしょうか
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
なお、DLLは頂いたもので、中で何をやっているのかは分かりません。
|
39
|
+
(※なお、DLLは頂いたもので、中で何をやっているのかは分かりません。
|
40
|
-
|
40
|
+
|
41
|
-
もともとはC/C++から使っていたライブラリであったようです。
|
41
|
+
もともとはC/C++から使っていたライブラリであったようです。)
|
42
42
|
|
43
43
|
|
44
44
|
|
@@ -60,13 +60,13 @@
|
|
60
60
|
|
61
61
|
```
|
62
62
|
|
63
|
-
func
|
63
|
+
before: GC(funcB) 0xe630020
|
64
|
-
|
64
|
+
|
65
|
-
func
|
65
|
+
after: GC(funcB) 0xe630020
|
66
|
-
|
66
|
+
|
67
|
-
func
|
67
|
+
before: GC(funcC) 0x1a0
|
68
|
-
|
68
|
+
|
69
|
-
runtime: bad pointer in frame main.main at 0x222cdf0
|
69
|
+
runtime: bad pointer in frame main.main at 0x222cdf0c: 0x1a0
|
70
70
|
|
71
71
|
fatal error: invalid stack pointer
|
72
72
|
|
@@ -74,53 +74,61 @@
|
|
74
74
|
|
75
75
|
runtime stack:
|
76
76
|
|
77
|
-
runtime.throw(0x4e
|
77
|
+
runtime.throw(0x4eeb10, 0x15)
|
78
|
-
|
78
|
+
|
79
|
-
|
79
|
+
C:/Go/src/runtime/panic.go:547 +0x7f fp=0x2a2fa0c sp=0x2a2fa00
|
80
|
-
|
80
|
+
|
81
|
-
runtime.adjustpointers(0x222cdf0
|
81
|
+
runtime.adjustpointers(0x222cdf0c, 0x2a2facc, 0x2a2fcac, 0x50e784)
|
82
|
-
|
82
|
+
|
83
|
-
|
83
|
+
C:/Go/src/runtime/stack.go:579 +0x235 fp=0x2a2fa80 sp=0x2a2fa0c
|
84
|
-
|
84
|
+
|
85
|
-
runtime.adjustframe(0x
|
85
|
+
runtime.adjustframe(0x2a2fc3c, 0x2a2fcac, 0x2a2fb01)
|
86
|
-
|
86
|
+
|
87
|
-
|
87
|
+
C:/Go/src/runtime/stack.go:644 +0x163 fp=0x2a2fae8 sp=0x2a2fa80
|
88
|
-
|
88
|
+
|
89
|
-
runtime.gentraceback(0x44a
|
89
|
+
runtime.gentraceback(0x44aa80, 0x222cdcf8, 0x0, 0x222b8000, 0x0, 0x0, 0x7fffffff, 0x506e60, 0x2a2fcac, 0x0, ...)
|
90
|
-
|
90
|
+
|
91
|
-
|
91
|
+
C:/Go/src/runtime/traceback.go:369 +0xbce fp=0x2a2fc68 sp=0x2a2fae8
|
92
|
-
|
92
|
+
|
93
|
-
runtime.copystack(0x222b
|
93
|
+
runtime.copystack(0x222b8000, 0x1000)
|
94
|
-
|
94
|
+
|
95
|
-
|
95
|
+
C:/Go/src/runtime/stack.go:759 +0x161 fp=0x2a2fda0 sp=0x2a2fc68
|
96
|
-
|
96
|
+
|
97
|
-
runtime.shrinkstack(0x222b
|
97
|
+
runtime.shrinkstack(0x222b8000)
|
98
|
-
|
98
|
+
|
99
|
-
|
99
|
+
C:/Go/src/runtime/stack.go:1026 +0x122 fp=0x2a2fdb8 sp=0x2a2fda0
|
100
100
|
|
101
101
|
runtime.markroot(0x5)
|
102
102
|
|
103
|
-
|
103
|
+
C:/Go/src/runtime/mgcmark.go:155 +0x23e fp=0x2a2fe0c sp=0x2a2fdb8
|
104
|
-
|
104
|
+
|
105
|
-
runtime.gcDrain(0x
|
105
|
+
runtime.gcDrain(0x2a2fe44, 0x0)
|
106
|
-
|
106
|
+
|
107
|
-
|
107
|
+
C:/Go/src/runtime/mgcmark.go:812 +0x26a fp=0x2a2fe34 sp=0x2a2fe0c
|
108
108
|
|
109
109
|
runtime.gchelper()
|
110
110
|
|
111
|
-
|
111
|
+
C:/Go/src/runtime/mgc.go:1806 +0x87 fp=0x2a2fe64 sp=0x2a2fe34
|
112
112
|
|
113
113
|
runtime.stopm()
|
114
114
|
|
115
|
-
|
115
|
+
C:/Go/src/runtime/proc.go:1541 +0x10c fp=0x2a2fe74 sp=0x2a2fe64
|
116
|
-
|
116
|
+
|
117
|
-
runtime.
|
117
|
+
runtime.findrunnable(0x222b4a00, 0x0)
|
118
|
-
|
118
|
+
|
119
|
-
|
119
|
+
C:/Go/src/runtime/proc.go:1976 +0x62a fp=0x2a2febc sp=0x2a2fe74
|
120
|
-
|
120
|
+
|
121
|
-
runtime.
|
121
|
+
runtime.schedule()
|
122
|
-
|
122
|
+
|
123
|
-
|
123
|
+
C:/Go/src/runtime/proc.go:2075 +0x202 fp=0x2a2fedc sp=0x2a2febc
|
124
|
+
|
125
|
+
runtime.park_m(0x222b84e0)
|
126
|
+
|
127
|
+
C:/Go/src/runtime/proc.go:2140 +0x163 fp=0x2a2fef0 sp=0x2a2fedc
|
128
|
+
|
129
|
+
runtime.mcall(0x933658)
|
130
|
+
|
131
|
+
C:/Go/src/runtime/asm_386.s:255 +0x47 fp=0x2a2fef8 sp=0x2a2fef0
|
124
132
|
|
125
133
|
|
126
134
|
|
@@ -128,31 +136,31 @@
|
|
128
136
|
|
129
137
|
runtime.systemstack_switch()
|
130
138
|
|
131
|
-
|
139
|
+
C:/Go/src/runtime/asm_386.s:267 fp=0x222cdcfc sp=0x222cdcf8
|
132
140
|
|
133
141
|
runtime.gcMarkTermination()
|
134
142
|
|
135
|
-
|
143
|
+
C:/Go/src/runtime/mgc.go:1182 +0x121 fp=0x222cdec4 sp=0x222cdcfc
|
136
|
-
|
144
|
+
|
137
|
-
runtime.gcStart(0x2, 0x222c
|
145
|
+
runtime.gcStart(0x2, 0x222c2000)
|
138
|
-
|
146
|
+
|
139
|
-
|
147
|
+
C:/Go/src/runtime/mgc.go:1018 +0x3f4 fp=0x222cdee4 sp=0x222cdec4
|
140
148
|
|
141
149
|
runtime.GC()
|
142
150
|
|
143
|
-
|
151
|
+
C:/Go/src/runtime/mgc.go:840 +0x26 fp=0x222cdef0 sp=0x222cdee4
|
144
152
|
|
145
153
|
main.main()
|
146
154
|
|
147
|
-
|
155
|
+
C:/dev/crash/crash.go:40 +0x3b4 fp=0x222cdfa8 sp=0x222cdef0
|
148
156
|
|
149
157
|
runtime.main()
|
150
158
|
|
151
|
-
|
159
|
+
C:/Go/src/runtime/proc.go:188 +0x234 fp=0x222cdfd0 sp=0x222cdfa8
|
152
|
-
|
160
|
+
|
153
|
-
runtime.goexit()
|
161
|
+
runtime.goexit()
|
154
|
-
|
162
|
+
|
155
|
-
|
163
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222cdfd4 sp=0x222cdfd0
|
156
164
|
|
157
165
|
|
158
166
|
|
@@ -160,83 +168,79 @@
|
|
160
168
|
|
161
169
|
runtime.goexit()
|
162
170
|
|
163
|
-
|
171
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222cbfd4 sp=0x222cbfd0
|
164
172
|
|
165
173
|
|
166
174
|
|
167
175
|
goroutine 2 [force gc (idle)]:
|
168
176
|
|
169
|
-
runtime.gopark(0x504
|
177
|
+
runtime.gopark(0x506f84, 0x55b488, 0x4e7b40, 0xf, 0x14, 0x1)
|
170
|
-
|
178
|
+
|
171
|
-
|
179
|
+
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222befa4 sp=0x222bef90
|
172
|
-
|
180
|
+
|
173
|
-
runtime.goparkunlock(0x55
|
181
|
+
runtime.goparkunlock(0x55b488, 0x4e7b40, 0xf, 0x222b8014, 0x1)
|
174
|
-
|
182
|
+
|
175
|
-
|
183
|
+
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222befc0 sp=0x222befa4
|
176
184
|
|
177
185
|
runtime.forcegchelper()
|
178
186
|
|
179
|
-
|
187
|
+
C:/Go/src/runtime/proc.go:229 +0xaa fp=0x222befd8 sp=0x222befc0
|
180
|
-
|
188
|
+
|
181
|
-
runtime.goexit()
|
189
|
+
runtime.goexit()
|
182
|
-
|
190
|
+
|
183
|
-
|
191
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222befdc sp=0x222befd8
|
184
192
|
|
185
193
|
created by runtime.init.4
|
186
194
|
|
187
|
-
|
195
|
+
C:/Go/src/runtime/proc.go:218 +0x2a
|
188
196
|
|
189
197
|
|
190
198
|
|
191
199
|
goroutine 3 [GC sweep wait]:
|
192
200
|
|
193
|
-
runtime.gopark(0x504
|
201
|
+
runtime.gopark(0x506f84, 0x55b500, 0x4e70b0, 0xd, 0x41c914, 0x1)
|
194
|
-
|
202
|
+
|
195
|
-
|
203
|
+
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222bff98 sp=0x222bff84
|
196
|
-
|
204
|
+
|
197
|
-
runtime.goparkunlock(0x55
|
205
|
+
runtime.goparkunlock(0x55b500, 0x4e70b0, 0xd, 0x14, 0x1)
|
198
|
-
|
206
|
+
|
199
|
-
|
207
|
+
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222bffb4 sp=0x222bff98
|
200
|
-
|
208
|
+
|
201
|
-
runtime.bgsweep(0x222a
|
209
|
+
runtime.bgsweep(0x222aa0c0)
|
202
|
-
|
210
|
+
|
203
|
-
|
211
|
+
C:/Go/src/runtime/mgcsweep.go:63 +0xa0 fp=0x222bffd0 sp=0x222bffb4
|
204
|
-
|
212
|
+
|
205
|
-
runtime.goexit()
|
213
|
+
runtime.goexit()
|
206
|
-
|
214
|
+
|
207
|
-
|
215
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222bffd4 sp=0x222bffd0
|
208
216
|
|
209
217
|
created by runtime.gcenable
|
210
218
|
|
211
|
-
|
219
|
+
C:/Go/src/runtime/mgc.go:191 +0x52
|
212
220
|
|
213
221
|
|
214
222
|
|
215
223
|
goroutine 4 [finalizer wait]:
|
216
224
|
|
217
|
-
runtime.gopark(0x504
|
225
|
+
runtime.gopark(0x506f84, 0x56b1e8, 0x4e7aa0, 0xe, 0x14, 0x1)
|
218
|
-
|
226
|
+
|
219
|
-
|
227
|
+
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c0f84 sp=0x222c0f70
|
220
|
-
|
228
|
+
|
221
|
-
runtime.goparkunlock(0x56
|
229
|
+
runtime.goparkunlock(0x56b1e8, 0x4e7aa0, 0xe, 0x14, 0x1)
|
222
|
-
|
230
|
+
|
223
|
-
|
231
|
+
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c0fa0 sp=0x222c0f84
|
224
232
|
|
225
233
|
runtime.runfinq()
|
226
234
|
|
227
|
-
|
235
|
+
C:/Go/src/runtime/mfinal.go:158 +0x9e fp=0x222c0fd8 sp=0x222c0fa0
|
228
|
-
|
236
|
+
|
229
|
-
runtime.goexit()
|
237
|
+
runtime.goexit()
|
230
|
-
|
238
|
+
|
231
|
-
|
239
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c0fdc sp=0x222c0fd8
|
232
240
|
|
233
241
|
created by runtime.createfing
|
234
242
|
|
235
|
-
|
243
|
+
C:/Go/src/runtime/mfinal.go:139 +0x5c
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
244
|
|
241
245
|
```
|
242
246
|
|
@@ -244,6 +248,42 @@
|
|
244
248
|
|
245
249
|
###該当のソースコード
|
246
250
|
|
251
|
+
**proprietarydll.h**
|
252
|
+
|
253
|
+
```C
|
254
|
+
|
255
|
+
#include <winsock2.h>
|
256
|
+
|
257
|
+
#include <windows.h>
|
258
|
+
|
259
|
+
|
260
|
+
|
261
|
+
// dummy value
|
262
|
+
|
263
|
+
#define SUCCESS 12345
|
264
|
+
|
265
|
+
|
266
|
+
|
267
|
+
// funcA is called to initialize this dll.
|
268
|
+
|
269
|
+
DWORD funcA();
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
// funcB returns a handle for funcC
|
274
|
+
|
275
|
+
HANDLE funcB();
|
276
|
+
|
277
|
+
|
278
|
+
|
279
|
+
// funcC requires a handle returned by funcB
|
280
|
+
|
281
|
+
HANDLE funcC(HANDLE);
|
282
|
+
|
283
|
+
```
|
284
|
+
|
285
|
+
**crash.go**
|
286
|
+
|
247
287
|
```go
|
248
288
|
|
249
289
|
package main
|
@@ -254,6 +294,8 @@
|
|
254
294
|
|
255
295
|
"fmt"
|
256
296
|
|
297
|
+
"log"
|
298
|
+
|
257
299
|
"runtime"
|
258
300
|
|
259
301
|
)
|
@@ -262,27 +304,11 @@
|
|
262
304
|
|
263
305
|
/*
|
264
306
|
|
265
|
-
#cgo LDFLAGS: -L. -l
|
307
|
+
#cgo LDFLAGS: -L. -lproprietarydll
|
308
|
+
|
266
|
-
|
309
|
+
#cgo CFLAGS: -I .
|
310
|
+
|
267
|
-
#include
|
311
|
+
#include "proprietarydll.h"
|
268
|
-
|
269
|
-
#ifdef _EXPORTING
|
270
|
-
|
271
|
-
#define CLASS_DECLSPEC __declspec(dllexport)
|
272
|
-
|
273
|
-
#else
|
274
|
-
|
275
|
-
#define CLASS_DECLSPEC __declspec(dllexport)
|
276
|
-
|
277
|
-
#endif
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
CLASS_DECLSPEC HANDLE funcA();
|
282
|
-
|
283
|
-
CLASS_DECLSPEC HANDLE funcB(HANDLE h);
|
284
|
-
|
285
|
-
CLASS_DECLSPEC DWORD funcC(HANDLE h, VOID* buf, DWORD siz);
|
286
312
|
|
287
313
|
*/
|
288
314
|
|
@@ -292,39 +318,55 @@
|
|
292
318
|
|
293
319
|
func main() {
|
294
320
|
|
321
|
+
if status, err := C.funcA(); status != C.SUCCESS || err != nil {
|
322
|
+
|
323
|
+
log.Fatal(err)
|
324
|
+
|
325
|
+
}
|
326
|
+
|
327
|
+
|
328
|
+
|
295
|
-
h
|
329
|
+
handleB, err := C.funcB()
|
330
|
+
|
296
|
-
|
331
|
+
if handleB == nil || err != nil {
|
332
|
+
|
297
|
-
if err != nil {
|
333
|
+
if err != nil {
|
334
|
+
|
335
|
+
log.Fatal(err)
|
336
|
+
|
337
|
+
}
|
338
|
+
|
339
|
+
log.Fatal("handleB is nil")
|
340
|
+
|
341
|
+
}
|
342
|
+
|
343
|
+
fmt.Println("before:\tGC(funcB)", handleB)
|
344
|
+
|
345
|
+
runtime.GC() // <- ここはエラーが出ない
|
346
|
+
|
347
|
+
fmt.Println("after:\tGC(funcB)", handleB)
|
348
|
+
|
349
|
+
|
350
|
+
|
351
|
+
handleC, err := C.funcC(handleB)
|
352
|
+
|
353
|
+
if handleC == nil || err != nil {
|
354
|
+
|
355
|
+
if err != nil {
|
356
|
+
|
357
|
+
log.Fatal("handleC is nil")
|
358
|
+
|
359
|
+
}
|
298
360
|
|
299
361
|
return
|
300
362
|
|
301
363
|
}
|
302
364
|
|
303
|
-
fmt.Println("func
|
365
|
+
fmt.Println("before:\tGC(funcC)", handleC)
|
304
|
-
|
366
|
+
|
305
|
-
runtime.GC() // <- ここはエラーが
|
367
|
+
runtime.GC() // <- ここはエラーが出る
|
306
|
-
|
368
|
+
|
307
|
-
fmt.Println("func
|
369
|
+
fmt.Println("after:\tGC(funcC)", handleC)
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
hB, err := C.funcB(hA)
|
312
|
-
|
313
|
-
if err != nil {
|
314
|
-
|
315
|
-
return
|
316
|
-
|
317
|
-
}
|
318
|
-
|
319
|
-
fmt.Println("funcB GC前:", hB)
|
320
|
-
|
321
|
-
runtime.GC() // <- ここでエラー
|
322
|
-
|
323
|
-
fmt.Println("funcA GC後:", hB)
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
// この後にC.funcCを呼び出したい
|
328
370
|
|
329
371
|
}
|
330
372
|
|
@@ -332,90 +374,6 @@
|
|
332
374
|
|
333
375
|
|
334
376
|
|
335
|
-
###試したこと
|
336
|
-
|
337
|
-
エラーが"invalid stack pointer"なので、heapに確保されるようにしたら違うエラーになるかもしれない、
|
338
|
-
|
339
|
-
と思い、[このサイト](http://najeira.blogspot.jp/2013/10/go.html)を参考に下記のように変更したところ、
|
340
|
-
|
341
|
-
エラーが起きなくなりました。
|
342
|
-
|
343
|
-
どうしてエラーが起きないのか分かりませんが、こちらもなにか関係するのでしょうか。
|
344
|
-
|
345
|
-
```diff
|
346
|
-
|
347
|
-
--- A.go 2016-04-21 14:29:41.571697100 +0900
|
348
|
-
|
349
|
-
+++ B.go 2016-04-21 14:29:40.741345000 +0900
|
350
|
-
|
351
|
-
@@ -14,6 +14,15 @@
|
352
|
-
|
353
|
-
*/
|
354
|
-
|
355
|
-
import "C"
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
+func funcBWrapper(C.HANDLE h) (*C.HANDLE, error) {
|
360
|
-
|
361
|
-
+ hB, err := C.funcB(h)
|
362
|
-
|
363
|
-
+ if err != nil {
|
364
|
-
|
365
|
-
+ return nil, err
|
366
|
-
|
367
|
-
+ }
|
368
|
-
|
369
|
-
+ // ポインタを返すとheapに置かれるらしい
|
370
|
-
|
371
|
-
+ return &hB, nil
|
372
|
-
|
373
|
-
+}
|
374
|
-
|
375
|
-
+
|
376
|
-
|
377
|
-
func main() {
|
378
|
-
|
379
|
-
hA, err := C.funcA()
|
380
|
-
|
381
|
-
if err != nil {
|
382
|
-
|
383
|
-
@@ -23,12 +32,12 @@
|
384
|
-
|
385
|
-
runtime.GC() // <- ここはエラーが起きない
|
386
|
-
|
387
|
-
fmt.Println("funcA GC後:", hA)
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
- hB, err := C.funcB(hA)
|
392
|
-
|
393
|
-
+ hB, err := funcBWrapper(hA)
|
394
|
-
|
395
|
-
if err != nil {
|
396
|
-
|
397
|
-
return
|
398
|
-
|
399
|
-
}
|
400
|
-
|
401
|
-
fmt.Println("funcB GC前:", hB)
|
402
|
-
|
403
|
-
- runtime.GC() // <- ここでエラー
|
404
|
-
|
405
|
-
+ runtime.GC() // <- ここでもエラーなし
|
406
|
-
|
407
|
-
fmt.Println("funcA GC後:", hB)
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
// この後にC.funcCを呼び出したい
|
412
|
-
|
413
|
-
```
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
377
|
###補足情報(言語/FW/ツール等のバージョンなど)
|
420
378
|
|
421
379
|
OS: Windows 7 64bit
|
4
プログラム中のfmt\.Printlnの文とログが一致しない部分を修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -60,11 +60,11 @@
|
|
60
60
|
|
61
61
|
```
|
62
62
|
|
63
|
-
funcA前: 0xe650020
|
63
|
+
funcA GC前: 0xe650020
|
64
|
-
|
64
|
+
|
65
|
-
funcA後: 0xe650020
|
65
|
+
funcA GC後: 0xe650020
|
66
|
-
|
66
|
+
|
67
|
-
funcB前: 0x198
|
67
|
+
funcB GC前: 0x198
|
68
68
|
|
69
69
|
runtime: bad pointer in frame main.main at 0x222cdf04: 0x198
|
70
70
|
|
3
新しいGo\(1\.6\.2\)が出ていたのでそちらで挑戦し、エラー出力を更新
test
CHANGED
File without changes
|
test
CHANGED
@@ -60,13 +60,13 @@
|
|
60
60
|
|
61
61
|
```
|
62
62
|
|
63
|
-
funcA
|
63
|
+
funcA前: 0xe650020
|
64
|
-
|
64
|
+
|
65
|
-
funcA
|
65
|
+
funcA後: 0xe650020
|
66
|
-
|
66
|
+
|
67
|
-
funcB
|
67
|
+
funcB前: 0x198
|
68
|
-
|
68
|
+
|
69
|
-
runtime: bad pointer in frame main.main at 0x222c
|
69
|
+
runtime: bad pointer in frame main.main at 0x222cdf04: 0x198
|
70
70
|
|
71
71
|
fatal error: invalid stack pointer
|
72
72
|
|
@@ -74,53 +74,53 @@
|
|
74
74
|
|
75
75
|
runtime stack:
|
76
76
|
|
77
|
-
runtime.throw(0x4e
|
77
|
+
runtime.throw(0x4ec610, 0x15)
|
78
|
-
|
78
|
+
|
79
|
-
C:/Go/src/runtime/panic.go:5
|
79
|
+
C:/Go/src/runtime/panic.go:547 +0x7f fp=0x7cdfa8c sp=0x7cdfa80
|
80
|
-
|
80
|
+
|
81
|
-
runtime.adjustpointers(0x222c
|
81
|
+
runtime.adjustpointers(0x222cdf04, 0x7cdfb4c, 0x7cdfd2c, 0x50bf58)
|
82
|
-
|
82
|
+
|
83
|
-
C:/Go/src/runtime/stack.go:579 +0x235 fp=0x
|
83
|
+
C:/Go/src/runtime/stack.go:579 +0x235 fp=0x7cdfb00 sp=0x7cdfa8c
|
84
|
-
|
84
|
+
|
85
|
-
runtime.adjustframe(0x
|
85
|
+
runtime.adjustframe(0x7cdfcbc, 0x7cdfd2c, 0x7cdfb01)
|
86
|
-
|
86
|
+
|
87
|
-
C:/Go/src/runtime/stack.go:644 +0x163 fp=0x
|
87
|
+
C:/Go/src/runtime/stack.go:644 +0x163 fp=0x7cdfb68 sp=0x7cdfb00
|
88
|
-
|
88
|
+
|
89
|
-
runtime.gentraceback(0x44
|
89
|
+
runtime.gentraceback(0x44ae70, 0x222cdcec, 0x0, 0x222ba000, 0x0, 0x0, 0x7fffffff, 0x5046c4, 0x7cdfd2c, 0x0, ...)
|
90
|
-
|
90
|
+
|
91
|
-
C:/Go/src/runtime/traceback.go:369 +0xbce fp=0x
|
91
|
+
C:/Go/src/runtime/traceback.go:369 +0xbce fp=0x7cdfce8 sp=0x7cdfb68
|
92
|
-
|
92
|
+
|
93
|
-
runtime.copystack(0x222b
|
93
|
+
runtime.copystack(0x222ba000, 0x1000)
|
94
|
-
|
94
|
+
|
95
|
-
C:/Go/src/runtime/stack.go:759 +0x161 fp=0x2
|
95
|
+
C:/Go/src/runtime/stack.go:759 +0x161 fp=0x7cdfe20 sp=0x7cdfce8
|
96
|
-
|
96
|
+
|
97
|
-
runtime.shrinkstack(0x222b
|
97
|
+
runtime.shrinkstack(0x222ba000)
|
98
|
-
|
98
|
+
|
99
|
-
C:/Go/src/runtime/stack.go:1026 +0x122 fp=0x
|
99
|
+
C:/Go/src/runtime/stack.go:1026 +0x122 fp=0x7cdfe38 sp=0x7cdfe20
|
100
100
|
|
101
101
|
runtime.markroot(0x5)
|
102
102
|
|
103
|
-
C:/Go/src/runtime/mgcmark.go:155 +0x23e fp=0x
|
103
|
+
C:/Go/src/runtime/mgcmark.go:155 +0x23e fp=0x7cdfe8c sp=0x7cdfe38
|
104
|
-
|
104
|
+
|
105
|
-
runtime.gcDrain(0x
|
105
|
+
runtime.gcDrain(0x7cdfec4, 0x0)
|
106
|
-
|
106
|
+
|
107
|
-
C:/Go/src/runtime/mgcmark.go:812 +0x26a fp=0x
|
107
|
+
C:/Go/src/runtime/mgcmark.go:812 +0x26a fp=0x7cdfeb4 sp=0x7cdfe8c
|
108
|
-
|
109
|
-
|
108
|
+
|
110
|
-
|
111
|
-
C:/Go/src/runtime/mgc.go:1559 +0xf3 fp=0x28fe18 sp=0x28fdac
|
112
|
-
|
113
|
-
runtime.gc
|
109
|
+
runtime.gchelper()
|
114
|
-
|
110
|
+
|
115
|
-
C:/Go/src/runtime/mgc.go:1
|
111
|
+
C:/Go/src/runtime/mgc.go:1806 +0x87 fp=0x7cdfee4 sp=0x7cdfeb4
|
112
|
+
|
116
|
-
|
113
|
+
runtime.stopm()
|
114
|
+
|
115
|
+
C:/Go/src/runtime/proc.go:1541 +0x10c fp=0x7cdfef4 sp=0x7cdfee4
|
116
|
+
|
117
|
-
runtime.
|
117
|
+
runtime.mstart1()
|
118
|
-
|
118
|
+
|
119
|
-
C:/Go/src/runtime/
|
119
|
+
C:/Go/src/runtime/proc.go:1103 +0xeb fp=0x7cdff04 sp=0x7cdfef4
|
120
120
|
|
121
121
|
runtime.mstart()
|
122
122
|
|
123
|
-
C:/Go/src/runtime/proc.go:10
|
123
|
+
C:/Go/src/runtime/proc.go:1068 +0x59 fp=0x7cdff0c sp=0x7cdff04
|
124
124
|
|
125
125
|
|
126
126
|
|
@@ -128,31 +128,31 @@
|
|
128
128
|
|
129
129
|
runtime.systemstack_switch()
|
130
130
|
|
131
|
-
C:/Go/src/runtime/asm_386.s:267 fp=0x222c
|
131
|
+
C:/Go/src/runtime/asm_386.s:267 fp=0x222cdcf0 sp=0x222cdcec
|
132
132
|
|
133
133
|
runtime.gcMarkTermination()
|
134
134
|
|
135
|
-
C:/Go/src/runtime/mgc.go:118
|
135
|
+
C:/Go/src/runtime/mgc.go:1182 +0x121 fp=0x222cdeb8 sp=0x222cdcf0
|
136
|
-
|
136
|
+
|
137
|
-
runtime.gcStart(0x2, 0x222c
|
137
|
+
runtime.gcStart(0x2, 0x222c4000)
|
138
|
-
|
138
|
+
|
139
|
-
C:/Go/src/runtime/mgc.go:101
|
139
|
+
C:/Go/src/runtime/mgc.go:1018 +0x3f4 fp=0x222cded8 sp=0x222cdeb8
|
140
140
|
|
141
141
|
runtime.GC()
|
142
142
|
|
143
|
-
C:/Go/src/runtime/mgc.go:840 +0x26 fp=0x222c
|
143
|
+
C:/Go/src/runtime/mgc.go:840 +0x26 fp=0x222cdee4 sp=0x222cded8
|
144
144
|
|
145
145
|
main.main()
|
146
146
|
|
147
|
-
C:/Users/user/Desktop/cgodll/
|
147
|
+
C:/Users/user/Desktop/cgodll/cgodll.go:31 +0x3c6 fp=0x222cdfa8 sp=0x222cdee4
|
148
148
|
|
149
149
|
runtime.main()
|
150
150
|
|
151
|
-
C:/Go/src/runtime/proc.go:188 +0x234 fp=0x222c
|
151
|
+
C:/Go/src/runtime/proc.go:188 +0x234 fp=0x222cdfd0 sp=0x222cdfa8
|
152
152
|
|
153
153
|
runtime.goexit()
|
154
154
|
|
155
|
-
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c
|
155
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222cdfd4 sp=0x222cdfd0
|
156
156
|
|
157
157
|
|
158
158
|
|
@@ -166,21 +166,21 @@
|
|
166
166
|
|
167
167
|
goroutine 2 [force gc (idle)]:
|
168
168
|
|
169
|
-
runtime.gopark(0x50
|
169
|
+
runtime.gopark(0x5047e8, 0x558480, 0x4e5760, 0xf, 0x1d14, 0x1)
|
170
|
-
|
170
|
+
|
171
|
-
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222
|
171
|
+
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c0fa4 sp=0x222c0f90
|
172
|
-
|
172
|
+
|
173
|
-
runtime.goparkunlock(0x55
|
173
|
+
runtime.goparkunlock(0x558480, 0x4e5760, 0xf, 0x222ba014, 0x1)
|
174
|
-
|
174
|
+
|
175
|
-
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222
|
175
|
+
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c0fc0 sp=0x222c0fa4
|
176
176
|
|
177
177
|
runtime.forcegchelper()
|
178
178
|
|
179
|
-
C:/Go/src/runtime/proc.go:229 +0xaa fp=0x222
|
179
|
+
C:/Go/src/runtime/proc.go:229 +0xaa fp=0x222c0fd8 sp=0x222c0fc0
|
180
180
|
|
181
181
|
runtime.goexit()
|
182
182
|
|
183
|
-
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222
|
183
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c0fdc sp=0x222c0fd8
|
184
184
|
|
185
185
|
created by runtime.init.4
|
186
186
|
|
@@ -190,21 +190,21 @@
|
|
190
190
|
|
191
191
|
goroutine 3 [GC sweep wait]:
|
192
192
|
|
193
|
-
runtime.gopark(0x50
|
193
|
+
runtime.gopark(0x5047e8, 0x5584f0, 0x4e4ca0, 0xd, 0x41cd14, 0x1)
|
194
|
-
|
194
|
+
|
195
|
-
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222
|
195
|
+
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c1f98 sp=0x222c1f84
|
196
|
-
|
196
|
+
|
197
|
-
runtime.goparkunlock(0x55
|
197
|
+
runtime.goparkunlock(0x5584f0, 0x4e4ca0, 0xd, 0x14, 0x1)
|
198
|
-
|
198
|
+
|
199
|
-
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222
|
199
|
+
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c1fb4 sp=0x222c1f98
|
200
|
-
|
200
|
+
|
201
|
-
runtime.bgsweep(0x222a80
|
201
|
+
runtime.bgsweep(0x222a8140)
|
202
|
-
|
202
|
+
|
203
|
-
C:/Go/src/runtime/mgcsweep.go:63 +0xa0 fp=0x222
|
203
|
+
C:/Go/src/runtime/mgcsweep.go:63 +0xa0 fp=0x222c1fd0 sp=0x222c1fb4
|
204
204
|
|
205
205
|
runtime.goexit()
|
206
206
|
|
207
|
-
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222
|
207
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c1fd4 sp=0x222c1fd0
|
208
208
|
|
209
209
|
created by runtime.gcenable
|
210
210
|
|
@@ -214,21 +214,21 @@
|
|
214
214
|
|
215
215
|
goroutine 4 [finalizer wait]:
|
216
216
|
|
217
|
-
runtime.gopark(0x50
|
217
|
+
runtime.gopark(0x5047e8, 0x5681e4, 0x4e56c0, 0xe, 0x14, 0x1)
|
218
|
-
|
218
|
+
|
219
|
-
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c
|
219
|
+
C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c2f84 sp=0x222c2f70
|
220
|
-
|
220
|
+
|
221
|
-
runtime.goparkunlock(0x56
|
221
|
+
runtime.goparkunlock(0x5681e4, 0x4e56c0, 0xe, 0x14, 0x1)
|
222
|
-
|
222
|
+
|
223
|
-
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c
|
223
|
+
C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c2fa0 sp=0x222c2f84
|
224
224
|
|
225
225
|
runtime.runfinq()
|
226
226
|
|
227
|
-
C:/Go/src/runtime/mfinal.go:158 +0x9e fp=0x222c
|
227
|
+
C:/Go/src/runtime/mfinal.go:158 +0x9e fp=0x222c2fd8 sp=0x222c2fa0
|
228
228
|
|
229
229
|
runtime.goexit()
|
230
230
|
|
231
|
-
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c
|
231
|
+
C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c2fdc sp=0x222c2fd8
|
232
232
|
|
233
233
|
created by runtime.createfing
|
234
234
|
|
@@ -236,6 +236,8 @@
|
|
236
236
|
|
237
237
|
|
238
238
|
|
239
|
+
|
240
|
+
|
239
241
|
```
|
240
242
|
|
241
243
|
|
@@ -418,4 +420,4 @@
|
|
418
420
|
|
419
421
|
OS: Windows 7 64bit
|
420
422
|
|
421
|
-
言語: Go 1.6.
|
423
|
+
言語: Go 1.6.2 32bit
|
2
文章構成の修正を行いました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
###
|
1
|
+
###質問内容
|
2
|
-
|
3
|
-
はじめまして、こんにちは。
|
4
|
-
|
5
|
-
|
6
2
|
|
7
3
|
現在Go言語でプログラミングを勉強中で、
|
8
4
|
|
@@ -14,6 +10,30 @@
|
|
14
10
|
|
15
11
|
後半部分で、funcCを無限ループ内で複数回呼び出したいと思っています。
|
16
12
|
|
13
|
+
ところが、数回呼び出した後に**"fatal error: invalid stack pointer"**というエラーが出てしまいました。
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
Go 1.6以降のGoとCの間でのポインタ渡しのルールも破っていないように思い、
|
18
|
+
|
19
|
+
どうしてエラーが出ているのかが分かりません。
|
20
|
+
|
21
|
+
類似した質問もなく、修正のための原因がわからず、質問しました。
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
このエラーの原因は何が考えられるでしょうか。
|
26
|
+
|
27
|
+
- プログラムのミスでしょうか(恐らくそうなのではと思っているのですが)
|
28
|
+
|
29
|
+
だとするとどの部分が悪いのでしょうか
|
30
|
+
|
31
|
+
- DLLのバグなのでしょうか
|
32
|
+
|
33
|
+
(Cから使う際には問題なく動くそうなのでこちらではないと思っています)
|
34
|
+
|
35
|
+
- 他の原因でしょうか
|
36
|
+
|
17
37
|
|
18
38
|
|
19
39
|
なお、DLLは頂いたもので、中で何をやっているのかは分かりません。
|
@@ -24,33 +44,19 @@
|
|
24
44
|
|
25
45
|
###発生している問題・エラーメッセージ
|
26
46
|
|
47
|
+
複数回funcCを呼び出すプログラムの吐くエラーから、
|
48
|
+
|
49
|
+
GCの前後でエラーが起きている様子である、というところまではわかりました。
|
50
|
+
|
51
|
+
|
52
|
+
|
27
|
-
下記のよう
|
53
|
+
したがって、下記のようにCの関数呼び出しの前後にruntime.GC()を呼び出すと、
|
28
|
-
|
54
|
+
|
29
|
-
"fatal error: invalid stack pointer"
|
55
|
+
同様のエラー**"fatal error: invalid stack pointer"**を出してプログラムが落ちました。
|
30
|
-
|
31
|
-
|
56
|
+
|
32
|
-
|
33
|
-
|
57
|
+
|
34
|
-
|
35
|
-
|
58
|
+
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
恐らくCの関数の呼び出し方等に間違いがあるのだと思っているのですが、
|
40
|
-
|
41
|
-
どうしてもどこが悪いのかがわからず、質問をいたしました。
|
42
|
-
|
43
|
-
1. どこが悪くてエラーが起きているのでしょうか。
|
44
|
-
|
45
|
-
(プログラムのどのあたりにミスが有るのでしょうか。)
|
46
|
-
|
47
|
-
2. 試したこと、にあるような書き換えを行うとエラーが起きませんでした。
|
48
|
-
|
49
|
-
これはなぜなのでしょうか。
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
エラーメッセージ
|
59
|
+
エラーメッセージは次のとおりです。
|
54
60
|
|
55
61
|
```
|
56
62
|
|
@@ -328,9 +334,11 @@
|
|
328
334
|
|
329
335
|
エラーが"invalid stack pointer"なので、heapに確保されるようにしたら違うエラーになるかもしれない、
|
330
336
|
|
331
|
-
と思い、[このサイト](http://najeira.blogspot.jp/2013/10/go.html)を参考に下記のように変更したところ、
|
337
|
+
と思い、[このサイト](http://najeira.blogspot.jp/2013/10/go.html)を参考に下記のように変更したところ、
|
338
|
+
|
332
|
-
|
339
|
+
エラーが起きなくなりました。
|
340
|
+
|
333
|
-
|
341
|
+
どうしてエラーが起きないのか分かりませんが、こちらもなにか関係するのでしょうか。
|
334
342
|
|
335
343
|
```diff
|
336
344
|
|
1
タイトルをわかりやすいように修正しました。本文の記述漏れを修正しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
fatal error: invalid stack pointer
|
1
|
+
fatal error: invalid stack pointerの原因
|
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
下記のようなプログラムの後半部分で、funcCを数回呼び出した後、
|
28
28
|
|
29
|
-
"fatal: invalid stack pointer"
|
29
|
+
"fatal error: invalid stack pointer"
|
30
30
|
|
31
31
|
なるエラーを出してプログラムが落ちてしまいました。
|
32
32
|
|