質問編集履歴

5

質問したいことをシンプルにしました。

2016/05/28 08:46

投稿

toko
toko

スコア144

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
- 後半部分でfuncC無限ループ内で複数回呼び出した思っています。
11
+ ところがproprietarydll.dllの関数を呼び出した後しばらくする
12
-
12
+
13
- ところが、数回呼び出した後に**"fatal error: invalid stack pointer"**というエラーが出てしまいました。
13
+ **"fatal error: invalid stack pointer"**というエラーが出てプログラムが終了てしまいました。
14
+
15
+
16
+
14
-
17
+ エラーはGCの際に起きているようだったので、
18
+
15
-
19
+ proprietarydll.dllの関数呼び出しの後にGCを呼び出すcrash.goのようなプログラムを書いたところ、
16
-
20
+
17
- Go 1.6以降のGoとCの間でのポインタ渡のルールも破っていないように思い、
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
- - DLLのバグなのでしょうか
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
- funcA GC前: 0xe650020
63
+ before: GC(funcB) 0xe630020
64
-
64
+
65
- funcA GC後: 0xe650020
65
+ after: GC(funcB) 0xe630020
66
-
66
+
67
- funcB GC前: 0x198
67
+ before: GC(funcC) 0x1a0
68
-
68
+
69
- runtime: bad pointer in frame main.main at 0x222cdf04: 0x198
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(0x4ec610, 0x15)
77
+ runtime.throw(0x4eeb10, 0x15)
78
-
78
+
79
- C:/Go/src/runtime/panic.go:547 +0x7f fp=0x7cdfa8c sp=0x7cdfa80
79
+ C:/Go/src/runtime/panic.go:547 +0x7f fp=0x2a2fa0c sp=0x2a2fa00
80
-
80
+
81
- runtime.adjustpointers(0x222cdf04, 0x7cdfb4c, 0x7cdfd2c, 0x50bf58)
81
+ runtime.adjustpointers(0x222cdf0c, 0x2a2facc, 0x2a2fcac, 0x50e784)
82
-
82
+
83
- C:/Go/src/runtime/stack.go:579 +0x235 fp=0x7cdfb00 sp=0x7cdfa8c
83
+ C:/Go/src/runtime/stack.go:579 +0x235 fp=0x2a2fa80 sp=0x2a2fa0c
84
-
84
+
85
- runtime.adjustframe(0x7cdfcbc, 0x7cdfd2c, 0x7cdfb01)
85
+ runtime.adjustframe(0x2a2fc3c, 0x2a2fcac, 0x2a2fb01)
86
-
86
+
87
- C:/Go/src/runtime/stack.go:644 +0x163 fp=0x7cdfb68 sp=0x7cdfb00
87
+ C:/Go/src/runtime/stack.go:644 +0x163 fp=0x2a2fae8 sp=0x2a2fa80
88
-
88
+
89
- runtime.gentraceback(0x44ae70, 0x222cdcec, 0x0, 0x222ba000, 0x0, 0x0, 0x7fffffff, 0x5046c4, 0x7cdfd2c, 0x0, ...)
89
+ runtime.gentraceback(0x44aa80, 0x222cdcf8, 0x0, 0x222b8000, 0x0, 0x0, 0x7fffffff, 0x506e60, 0x2a2fcac, 0x0, ...)
90
-
90
+
91
- C:/Go/src/runtime/traceback.go:369 +0xbce fp=0x7cdfce8 sp=0x7cdfb68
91
+ C:/Go/src/runtime/traceback.go:369 +0xbce fp=0x2a2fc68 sp=0x2a2fae8
92
-
92
+
93
- runtime.copystack(0x222ba000, 0x1000)
93
+ runtime.copystack(0x222b8000, 0x1000)
94
-
94
+
95
- C:/Go/src/runtime/stack.go:759 +0x161 fp=0x7cdfe20 sp=0x7cdfce8
95
+ C:/Go/src/runtime/stack.go:759 +0x161 fp=0x2a2fda0 sp=0x2a2fc68
96
-
96
+
97
- runtime.shrinkstack(0x222ba000)
97
+ runtime.shrinkstack(0x222b8000)
98
-
98
+
99
- C:/Go/src/runtime/stack.go:1026 +0x122 fp=0x7cdfe38 sp=0x7cdfe20
99
+ C:/Go/src/runtime/stack.go:1026 +0x122 fp=0x2a2fdb8 sp=0x2a2fda0
100
100
 
101
101
  runtime.markroot(0x5)
102
102
 
103
- C:/Go/src/runtime/mgcmark.go:155 +0x23e fp=0x7cdfe8c sp=0x7cdfe38
103
+ C:/Go/src/runtime/mgcmark.go:155 +0x23e fp=0x2a2fe0c sp=0x2a2fdb8
104
-
104
+
105
- runtime.gcDrain(0x7cdfec4, 0x0)
105
+ runtime.gcDrain(0x2a2fe44, 0x0)
106
-
106
+
107
- C:/Go/src/runtime/mgcmark.go:812 +0x26a fp=0x7cdfeb4 sp=0x7cdfe8c
107
+ C:/Go/src/runtime/mgcmark.go:812 +0x26a fp=0x2a2fe34 sp=0x2a2fe0c
108
108
 
109
109
  runtime.gchelper()
110
110
 
111
- C:/Go/src/runtime/mgc.go:1806 +0x87 fp=0x7cdfee4 sp=0x7cdfeb4
111
+ C:/Go/src/runtime/mgc.go:1806 +0x87 fp=0x2a2fe64 sp=0x2a2fe34
112
112
 
113
113
  runtime.stopm()
114
114
 
115
- C:/Go/src/runtime/proc.go:1541 +0x10c fp=0x7cdfef4 sp=0x7cdfee4
115
+ C:/Go/src/runtime/proc.go:1541 +0x10c fp=0x2a2fe74 sp=0x2a2fe64
116
-
116
+
117
- runtime.mstart1()
117
+ runtime.findrunnable(0x222b4a00, 0x0)
118
-
118
+
119
- C:/Go/src/runtime/proc.go:1103 +0xeb fp=0x7cdff04 sp=0x7cdfef4
119
+ C:/Go/src/runtime/proc.go:1976 +0x62a fp=0x2a2febc sp=0x2a2fe74
120
-
120
+
121
- runtime.mstart()
121
+ runtime.schedule()
122
-
122
+
123
- C:/Go/src/runtime/proc.go:1068 +0x59 fp=0x7cdff0c sp=0x7cdff04
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
- C:/Go/src/runtime/asm_386.s:267 fp=0x222cdcf0 sp=0x222cdcec
139
+ C:/Go/src/runtime/asm_386.s:267 fp=0x222cdcfc sp=0x222cdcf8
132
140
 
133
141
  runtime.gcMarkTermination()
134
142
 
135
- C:/Go/src/runtime/mgc.go:1182 +0x121 fp=0x222cdeb8 sp=0x222cdcf0
143
+ C:/Go/src/runtime/mgc.go:1182 +0x121 fp=0x222cdec4 sp=0x222cdcfc
136
-
144
+
137
- runtime.gcStart(0x2, 0x222c4000)
145
+ runtime.gcStart(0x2, 0x222c2000)
138
-
146
+
139
- C:/Go/src/runtime/mgc.go:1018 +0x3f4 fp=0x222cded8 sp=0x222cdeb8
147
+ C:/Go/src/runtime/mgc.go:1018 +0x3f4 fp=0x222cdee4 sp=0x222cdec4
140
148
 
141
149
  runtime.GC()
142
150
 
143
- C:/Go/src/runtime/mgc.go:840 +0x26 fp=0x222cdee4 sp=0x222cded8
151
+ C:/Go/src/runtime/mgc.go:840 +0x26 fp=0x222cdef0 sp=0x222cdee4
144
152
 
145
153
  main.main()
146
154
 
147
- C:/Users/user/Desktop/cgodll/cgodll.go:31 +0x3c6 fp=0x222cdfa8 sp=0x222cdee4
155
+ C:/dev/crash/crash.go:40 +0x3b4 fp=0x222cdfa8 sp=0x222cdef0
148
156
 
149
157
  runtime.main()
150
158
 
151
- C:/Go/src/runtime/proc.go:188 +0x234 fp=0x222cdfd0 sp=0x222cdfa8
159
+ C:/Go/src/runtime/proc.go:188 +0x234 fp=0x222cdfd0 sp=0x222cdfa8
152
-
160
+
153
- runtime.goexit()
161
+ runtime.goexit()
154
-
162
+
155
- C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222cdfd4 sp=0x222cdfd0
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
- C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222cbfd4 sp=0x222cbfd0
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(0x5047e8, 0x558480, 0x4e5760, 0xf, 0x1d14, 0x1)
177
+ runtime.gopark(0x506f84, 0x55b488, 0x4e7b40, 0xf, 0x14, 0x1)
170
-
178
+
171
- C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c0fa4 sp=0x222c0f90
179
+ C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222befa4 sp=0x222bef90
172
-
180
+
173
- runtime.goparkunlock(0x558480, 0x4e5760, 0xf, 0x222ba014, 0x1)
181
+ runtime.goparkunlock(0x55b488, 0x4e7b40, 0xf, 0x222b8014, 0x1)
174
-
182
+
175
- C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c0fc0 sp=0x222c0fa4
183
+ C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222befc0 sp=0x222befa4
176
184
 
177
185
  runtime.forcegchelper()
178
186
 
179
- C:/Go/src/runtime/proc.go:229 +0xaa fp=0x222c0fd8 sp=0x222c0fc0
187
+ C:/Go/src/runtime/proc.go:229 +0xaa fp=0x222befd8 sp=0x222befc0
180
-
188
+
181
- runtime.goexit()
189
+ runtime.goexit()
182
-
190
+
183
- C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c0fdc sp=0x222c0fd8
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
- C:/Go/src/runtime/proc.go:218 +0x2a
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(0x5047e8, 0x5584f0, 0x4e4ca0, 0xd, 0x41cd14, 0x1)
201
+ runtime.gopark(0x506f84, 0x55b500, 0x4e70b0, 0xd, 0x41c914, 0x1)
194
-
202
+
195
- C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c1f98 sp=0x222c1f84
203
+ C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222bff98 sp=0x222bff84
196
-
204
+
197
- runtime.goparkunlock(0x5584f0, 0x4e4ca0, 0xd, 0x14, 0x1)
205
+ runtime.goparkunlock(0x55b500, 0x4e70b0, 0xd, 0x14, 0x1)
198
-
206
+
199
- C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c1fb4 sp=0x222c1f98
207
+ C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222bffb4 sp=0x222bff98
200
-
208
+
201
- runtime.bgsweep(0x222a8140)
209
+ runtime.bgsweep(0x222aa0c0)
202
-
210
+
203
- C:/Go/src/runtime/mgcsweep.go:63 +0xa0 fp=0x222c1fd0 sp=0x222c1fb4
211
+ C:/Go/src/runtime/mgcsweep.go:63 +0xa0 fp=0x222bffd0 sp=0x222bffb4
204
-
212
+
205
- runtime.goexit()
213
+ runtime.goexit()
206
-
214
+
207
- C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c1fd4 sp=0x222c1fd0
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
- C:/Go/src/runtime/mgc.go:191 +0x52
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(0x5047e8, 0x5681e4, 0x4e56c0, 0xe, 0x14, 0x1)
225
+ runtime.gopark(0x506f84, 0x56b1e8, 0x4e7aa0, 0xe, 0x14, 0x1)
218
-
226
+
219
- C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c2f84 sp=0x222c2f70
227
+ C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c0f84 sp=0x222c0f70
220
-
228
+
221
- runtime.goparkunlock(0x5681e4, 0x4e56c0, 0xe, 0x14, 0x1)
229
+ runtime.goparkunlock(0x56b1e8, 0x4e7aa0, 0xe, 0x14, 0x1)
222
-
230
+
223
- C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c2fa0 sp=0x222c2f84
231
+ C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c0fa0 sp=0x222c0f84
224
232
 
225
233
  runtime.runfinq()
226
234
 
227
- C:/Go/src/runtime/mfinal.go:158 +0x9e fp=0x222c2fd8 sp=0x222c2fa0
235
+ C:/Go/src/runtime/mfinal.go:158 +0x9e fp=0x222c0fd8 sp=0x222c0fa0
228
-
236
+
229
- runtime.goexit()
237
+ runtime.goexit()
230
-
238
+
231
- C:/Go/src/runtime/asm_386.s:1585 +0x1 fp=0x222c2fdc sp=0x222c2fd8
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
- C:/Go/src/runtime/mfinal.go:139 +0x5c
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. -lhogedll
307
+ #cgo LDFLAGS: -L. -lproprietarydll
308
+
266
-
309
+ #cgo CFLAGS: -I .
310
+
267
- #include<window.h>
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
- hA, err := C.funcA()
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("funcA GC前:", hA)
365
+ fmt.Println("before:\tGC(funcC)", handleC)
304
-
366
+
305
- runtime.GC() // <- ここはエラーが起きない
367
+ runtime.GC() // <- ここはエラーが出る
306
-
368
+
307
- fmt.Println("funcA GC後:", hA)
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の文とログが一致しない部分を修正しました。

2016/05/28 08:45

投稿

toko
toko

スコア144

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\)が出ていたのでそちらで挑戦し、エラー出力を更新

2016/04/21 09:37

投稿

toko
toko

スコア144

test CHANGED
File without changes
test CHANGED
@@ -60,13 +60,13 @@
60
60
 
61
61
  ```
62
62
 
63
- funcA GC前: 0xe1f0020
63
+ funcA前: 0xe650020
64
-
64
+
65
- funcA GC前: 0xe1f0020
65
+ funcA: 0xe650020
66
-
66
+
67
- funcB GC前: 0x19c
67
+ funcB前: 0x198
68
-
68
+
69
- runtime: bad pointer in frame main.main at 0x222c9f3c: 0x19c
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(0x4ed300, 0x15)
77
+ runtime.throw(0x4ec610, 0x15)
78
-
78
+
79
- C:/Go/src/runtime/panic.go:530 +0x7f fp=0x28f984 sp=0x28f978
79
+ C:/Go/src/runtime/panic.go:547 +0x7f fp=0x7cdfa8c sp=0x7cdfa80
80
-
80
+
81
- runtime.adjustpointers(0x222c9ef8, 0x28fa44, 0x28fc24, 0x50ce3c)
81
+ runtime.adjustpointers(0x222cdf04, 0x7cdfb4c, 0x7cdfd2c, 0x50bf58)
82
-
82
+
83
- C:/Go/src/runtime/stack.go:579 +0x235 fp=0x28f9f8 sp=0x28f984
83
+ C:/Go/src/runtime/stack.go:579 +0x235 fp=0x7cdfb00 sp=0x7cdfa8c
84
-
84
+
85
- runtime.adjustframe(0x28fbb4, 0x28fc24, 0x28fa01)
85
+ runtime.adjustframe(0x7cdfcbc, 0x7cdfd2c, 0x7cdfb01)
86
-
86
+
87
- C:/Go/src/runtime/stack.go:644 +0x163 fp=0x28fa60 sp=0x28f9f8
87
+ C:/Go/src/runtime/stack.go:644 +0x163 fp=0x7cdfb68 sp=0x7cdfb00
88
-
88
+
89
- runtime.gentraceback(0x44b770, 0x222c9cd4, 0x0, 0x222b8000, 0x0, 0x0, 0x7fffffff, 0x5054cc, 0x28fc24, 0x0, ...)
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=0x28fbe0 sp=0x28fa60
91
+ C:/Go/src/runtime/traceback.go:369 +0xbce fp=0x7cdfce8 sp=0x7cdfb68
92
-
92
+
93
- runtime.copystack(0x222b8000, 0x1000)
93
+ runtime.copystack(0x222ba000, 0x1000)
94
-
94
+
95
- C:/Go/src/runtime/stack.go:759 +0x161 fp=0x28fd18 sp=0x28fbe0
95
+ C:/Go/src/runtime/stack.go:759 +0x161 fp=0x7cdfe20 sp=0x7cdfce8
96
-
96
+
97
- runtime.shrinkstack(0x222b8000)
97
+ runtime.shrinkstack(0x222ba000)
98
-
98
+
99
- C:/Go/src/runtime/stack.go:1026 +0x122 fp=0x28fd30 sp=0x28fd18
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=0x28fd84 sp=0x28fd30
103
+ C:/Go/src/runtime/mgcmark.go:155 +0x23e fp=0x7cdfe8c sp=0x7cdfe38
104
-
104
+
105
- runtime.gcDrain(0x28fdfc, 0x0)
105
+ runtime.gcDrain(0x7cdfec4, 0x0)
106
-
106
+
107
- C:/Go/src/runtime/mgcmark.go:812 +0x26a fp=0x28fdac sp=0x28fd84
107
+ C:/Go/src/runtime/mgcmark.go:812 +0x26a fp=0x7cdfeb4 sp=0x7cdfe8c
108
-
109
- runtime.gcMark(0xa28e9a14, 0x6c9)
108
+
110
-
111
- C:/Go/src/runtime/mgc.go:1559 +0xf3 fp=0x28fe18 sp=0x28fdac
112
-
113
- runtime.gcMarkTermination.func1()
109
+ runtime.gchelper()
114
-
110
+
115
- C:/Go/src/runtime/mgc.go:1173 +0x29 fp=0x28fe24 sp=0x28fe18
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.systemstack(0x5597a0)
117
+ runtime.mstart1()
118
-
118
+
119
- C:/Go/src/runtime/asm_386.s:313 +0x5e fp=0x28fe28 sp=0x28fe24
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:1048 fp=0x28fe2c sp=0x28fe28
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=0x222c9cd8 sp=0x222c9cd4
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:1181 +0x121 fp=0x222c9ea0 sp=0x222c9cd8
135
+ C:/Go/src/runtime/mgc.go:1182 +0x121 fp=0x222cdeb8 sp=0x222cdcf0
136
-
136
+
137
- runtime.gcStart(0x2, 0x222c2000)
137
+ runtime.gcStart(0x2, 0x222c4000)
138
-
138
+
139
- C:/Go/src/runtime/mgc.go:1017 +0x3f4 fp=0x222c9ec0 sp=0x222c9ea0
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=0x222c9ecc sp=0x222c9ec0
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/main.go:31 +0x87a fp=0x222c9fa8 sp=0x222c9ecc
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=0x222c9fd0 sp=0x222c9fa8
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=0x222c9fd4 sp=0x222c9fd0
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(0x5055f4, 0x559480, 0x4e63e0, 0xf, 0x614, 0x1)
169
+ runtime.gopark(0x5047e8, 0x558480, 0x4e5760, 0xf, 0x1d14, 0x1)
170
-
170
+
171
- C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222befa4 sp=0x222bef90
171
+ C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c0fa4 sp=0x222c0f90
172
-
172
+
173
- runtime.goparkunlock(0x559480, 0x4e63e0, 0xf, 0x222b8014, 0x1)
173
+ runtime.goparkunlock(0x558480, 0x4e5760, 0xf, 0x222ba014, 0x1)
174
-
174
+
175
- C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222befc0 sp=0x222befa4
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=0x222befd8 sp=0x222befc0
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=0x222befdc sp=0x222befd8
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(0x5055f4, 0x5594f0, 0x4e5920, 0xd, 0x41d314, 0x1)
193
+ runtime.gopark(0x5047e8, 0x5584f0, 0x4e4ca0, 0xd, 0x41cd14, 0x1)
194
-
194
+
195
- C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222bff98 sp=0x222bff84
195
+ C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c1f98 sp=0x222c1f84
196
-
196
+
197
- runtime.goparkunlock(0x5594f0, 0x4e5920, 0xd, 0x14, 0x1)
197
+ runtime.goparkunlock(0x5584f0, 0x4e4ca0, 0xd, 0x14, 0x1)
198
-
198
+
199
- C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222bffb4 sp=0x222bff98
199
+ C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c1fb4 sp=0x222c1f98
200
-
200
+
201
- runtime.bgsweep(0x222a80c0)
201
+ runtime.bgsweep(0x222a8140)
202
-
202
+
203
- C:/Go/src/runtime/mgcsweep.go:63 +0xa0 fp=0x222bffd0 sp=0x222bffb4
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=0x222bffd4 sp=0x222bffd0
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(0x5055f4, 0x5691e4, 0x4e6340, 0xe, 0x14, 0x1)
217
+ runtime.gopark(0x5047e8, 0x5681e4, 0x4e56c0, 0xe, 0x14, 0x1)
218
-
218
+
219
- C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c0f84 sp=0x222c0f70
219
+ C:/Go/src/runtime/proc.go:262 +0x130 fp=0x222c2f84 sp=0x222c2f70
220
-
220
+
221
- runtime.goparkunlock(0x5691e4, 0x4e6340, 0xe, 0x14, 0x1)
221
+ runtime.goparkunlock(0x5681e4, 0x4e56c0, 0xe, 0x14, 0x1)
222
-
222
+
223
- C:/Go/src/runtime/proc.go:268 +0x4b fp=0x222c0fa0 sp=0x222c0f84
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=0x222c0fd8 sp=0x222c0fa0
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=0x222c0fdc sp=0x222c0fd8
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.1 32bit
423
+ 言語: Go 1.6.2 32bit

2

文章構成の修正を行いました。

2016/04/21 09:33

投稿

toko
toko

スコア144

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
- 下記のようなプログラムの後半部分で、funcCを数回呼び出した後
53
+ したがって、下記のようにC関数呼び出しの前にruntime.GC()を呼び出すと
28
-
54
+
29
- "fatal error: invalid stack pointer"
55
+ 同様のエラー**"fatal error: invalid stack pointer"**を出してプログラムが落ちました。
30
-
31
- なるエラーを出してプログラムが落ちてしまいました。
56
+
32
-
33
- 試行錯誤した結果、GCの前後でエラーが起きている様子である、
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

タイトルをわかりやすいように修正しました。本文の記述漏れを修正しました。

2016/04/21 08:07

投稿

toko
toko

スコア144

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