mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 10:47:27 +08:00 
			
		
		
		
	 5b9f65dac2
			
		
	
	5b9f65dac2
	
	
	
		
			
			Go 1.20 switched to uint64 to represent goroutine IDs, we can't actually follow suit because we have allowed clients to use -1 to refer to the currently selected goroutine, however we should at least switch to int64 and also update the rtype check to accept the 1.20 type.
		
			
				
	
	
		
			54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package proc
 | |
| 
 | |
| type goroutineCache struct {
 | |
| 	partialGCache map[int64]*G
 | |
| 	allGCache     []*G
 | |
| 
 | |
| 	allgentryAddr, allglenAddr uint64
 | |
| }
 | |
| 
 | |
| func (gcache *goroutineCache) init(bi *BinaryInfo) {
 | |
| 	var err error
 | |
| 
 | |
| 	exeimage := bi.Images[0]
 | |
| 	rdr := exeimage.DwarfReader()
 | |
| 
 | |
| 	gcache.allglenAddr, _ = rdr.AddrFor("runtime.allglen", exeimage.StaticBase, bi.Arch.PtrSize())
 | |
| 
 | |
| 	rdr.Seek(0)
 | |
| 	gcache.allgentryAddr, err = rdr.AddrFor("runtime.allgs", exeimage.StaticBase, bi.Arch.PtrSize())
 | |
| 	if err != nil {
 | |
| 		// try old name (pre Go 1.6)
 | |
| 		gcache.allgentryAddr, _ = rdr.AddrFor("runtime.allg", exeimage.StaticBase, bi.Arch.PtrSize())
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (gcache *goroutineCache) getRuntimeAllg(bi *BinaryInfo, mem MemoryReadWriter) (uint64, uint64, error) {
 | |
| 	if gcache.allglenAddr == 0 || gcache.allgentryAddr == 0 {
 | |
| 		return 0, 0, ErrNoRuntimeAllG
 | |
| 	}
 | |
| 	allglen, err := readUintRaw(mem, gcache.allglenAddr, int64(bi.Arch.PtrSize()))
 | |
| 	if err != nil {
 | |
| 		return 0, 0, err
 | |
| 	}
 | |
| 
 | |
| 	allgptr, err := readUintRaw(mem, gcache.allgentryAddr, int64(bi.Arch.PtrSize()))
 | |
| 	if err != nil {
 | |
| 		return 0, 0, err
 | |
| 	}
 | |
| 	return allgptr, allglen, nil
 | |
| }
 | |
| 
 | |
| func (gcache *goroutineCache) addGoroutine(g *G) {
 | |
| 	if gcache.partialGCache == nil {
 | |
| 		gcache.partialGCache = make(map[int64]*G)
 | |
| 	}
 | |
| 	gcache.partialGCache[g.ID] = g
 | |
| }
 | |
| 
 | |
| // Clear clears the cached contents of the cache for runtime.allgs.
 | |
| func (gcache *goroutineCache) Clear() {
 | |
| 	gcache.partialGCache = nil
 | |
| 	gcache.allGCache = nil
 | |
| }
 |